2

コードの望ましい出力は、b インスタンスを保持する 1 つのエントリを持つクラス変数 Team.stuff があり、Player.stuff 変数が空であることです。代わりにエラーが発生します...

class Player:
  stuff=[]
  def __init__(self):
    cls.stuff.append(self)

class Team(Player):
  def __init__(self):
    super(Team, self).__init__()

b=Team()

エラー

cls.stuff.append(self)
NameError: global name 'cls' is not defined

で cls 変数を渡すことができましたがTeam.__init__()、それが「正しい」方法であるかどうかはわかりません。さらに重要なことにPlayer.__init__()、クラス変数が必要であり、その方法に関する構文がわかりません。

4

3 に答える 3

2
class Player(object):
    stuff=[]
    def __init__(self):
        self.stuff.append(self)

class Team(Player):
    def __init__(self):
        super(Team, self).__init__()

b = Team()
print(Team.stuff)

印刷物(のようなもの)

[<__main__.Team object at 0xb7519dec>]
于 2013-10-10T16:38:27.883 に答える
1

clsこれは Python のキーワードではないことに注意してください。むしろ、メソッドがクラス関数であり、何かの特定のインスタンスで呼び出される関数ではない場合、メソッドの最初の引数の規則です。

stuff関数の属性になりたい場合は、次のように定義する必要がありますself.stuff=[]

そして、メソッドでそれを参照するときは、selfキーワードも使用してください: self.stuff.append(..).

于 2013-10-10T16:33:24.943 に答える
1

この理由はcls__init__関数が定義されていないためです。引数名selfclsは単なる命名規則です。実際には、インスタンスとクラスメソッドにそれぞれ名前を付けてfoobarクラスfooインスタンスをbar指し、クラス自体を指すことができます。

さらに、属性を検索するときに有効です。オブジェクトの辞書にself.stuffそのような名前の属性がない場合は、代わりにそのクラスの が検索されます。両方が欠落している場合は、順序に従ってさらに検索が行われます。__dict____dict__mro

オブジェクト インスタンスに属性を設定すると、クラス定義がシャドウされることに注意してください。stuff

例で説明:

class MyClassA(object):
    stuff = []

class MyClassB(MyClassA):
     def __init__(foobar):
         # `foobar` points at the instance of `MyClassB` class.

         # MyClassA.stuff gets `1` object appended to it.
         foobar.stuff.append(1)

         # This should print '[1]'
         print foobar.stuff

         # `MyClassB` object gets a _new_ attribute named `stuff` pointing at a list.
         foobar.stuff = []

         # This should print '[]'.
         print foobar.stuff
于 2013-10-10T16:36:43.847 に答える