如何让子类使用父变量而不重新定义它们?

xav*_*did 2 python inheritance

长时间读者,第一次问问.无论如何,这是我正在使用的代码:

class Person(object):
  def __init__(self, s):
    self.name = s
    self.secret = 'I HAVE THE COOKIES'

  @classmethod
  def shout(self):
    print self.name.upper()

class Kid(Person):
  def __init__(self, s):
    super(Kid,self).__init__(s)
    self.age = 12

b = Person('Bob')
k = Kid('Bobby')
print b.name
print k.name
print k.age
print k.secret
k.shout()
Run Code Online (Sandbox Code Playgroud)

这导致此输出和错误:

Bob
Bobby
12
I HAVE THE COOKIES
Traceback (most recent call last):
File "a.py", line 22, in <module>
  k.shout()
File "a.py", line 8, in shout
  print self.name.upper()
AttributeError: type object 'Kid' has no attribute 'name'
Run Code Online (Sandbox Code Playgroud)

我认为Kid可以使用Person's shout方法替换其(孩子的)"self"替换父级(方法所在的位置).显然,事实并非如此.我知道我可以在init之外声明名称,但是这两者都无法容纳输入的数据和禁止输入数据.另一种选择是为Person的每个孩子重新定义呼喊,但这是我试图避免的许多重复代码.

首先十分感谢!

Mic*_*kel 6

问题是这@classmethod是一个类的方法.它无权访问实例的属性.具体来说,该方法实际上是传递了类对象,因此self被错误地命名.你应该真的打电话给shout我们cls.如果你删除@classmethod那么这将是有意义的,你的代码将按预期工作.

事实上,你可以认为k.shout()它等同于Kid.shout().