我是一名Python新手,正在尝试理解继承方法背后的哲学/逻辑。问题最终涉及到为什么以及何时必须在子类中使用__init__
方法。例如:
看起来从超类继承的子类不需要自己的构造函数(__init__)
方法。下面是一个狗继承了哺乳动物的属性(名称、年龄)和方法(makenoise)。你甚至可以添加一个方法(do_a_trick
)。所有的东西都像“应该”的那样工作。
然而,如果我想要在子类中添加一个新的属性,就像我在Cats类中尝试的那样,我会得到一个错误,说"self"未定义。但是我在狗类的定义中使用了"self"。这之间的区别是什么?
似乎要按照我的意愿来定义Cats,我需要使用__init__(self,name)
和super()__init__(name)
。为什么会有这种差异呢?
class Mammals(object):
def __init__(self,name):
self.name = name
print("I am a new-born "+ self.name)
self.age = 0
def makenoise(self):
print(self.name + " says Hello")
class Dogs(Mammals):
def do_a_trick(self):
print(self.name + " can roll over")
class Cats(Mammals):
self.furry = "True" #results in error `self' is not defined
mymammal = Mammals("zebra") #output "I am a new-born zebra"
mymammal.makenoise() #output "zebra says hello"
print(mymmmal.age) #output 0
mydog = Dogs("family pet") #output "I am a new-born family pet"
mydog.makenoise() #output "family pet says hello"
print(mydog.age) # output 0
mydog.do_a_trick() #output "family pet can roll over"
__init__
不是构造函数,而是初始化器,它在已经构造好的self
实例上工作。 - Azat Ibrakov