繁体   English   中英

Python类继承,__init__和cls

[英]Python Class Inheritance, __init__ and cls

代码的期望输出是我有一个类变量Team.stuff,该变量具有一个保存b实例的条目,而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

我可以在Team.__init__()传递cls变量,但是我不确定这是否是“正确”的方法,更重要的是Player.__init__()是否需要一个类变量,我不确定关于如何做到这一点的语法。

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>]

请记住, cls不是Python中的关键字。 相反,当方法的第一个参数被认为是类函数而不是在某个特定事物的实例上被调用的方法时,它是一个约定。

如果要将stuff作为函数的属性 ,则必须像这样定义它: self.stuff=[]

然后,当您在方法中引用它时,也要使用self关键字: self.stuff.append(..)

原因是未定义__init__函数中的cls 参数名称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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM