Python继承:何时以及为什么__init__

我是一个
Python新手,试图理解继承方法背后的哲学/逻辑.问题最终会考虑为何以及何时必须在子类中使用__init__方法.例:

似乎从超类继承的子类不需要有自己的构造函数(__init__)方法.下面,狗继承了哺乳动物的属性(名称,年龄)和方法(makenoise).你甚至可以添加一个方法(do_a_trick)似乎所有东西都是“应该”的.

但是,如果我想在Cats类中尝试在子类中添加一个新属性,我会收到一条错误,说“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"

最佳答案

if I wanted to add a new attribute in the subclass as I attempt to do
in the Cats class, I get an error saying “self” is not defined. Yet I
used “self” in the definition of the dog class.

在你的超类Mammal中,你有一个__init__函数,它接受你选择的参数*来调用self.当你在__init__函数的主体中时,这个参数在范围内 – 它是一个局部变量,就像任何局部变量一样,并且在包含函数终止后不可能引用它.
在Dog类do_a_trick上定义的函数也接受一个名为self的参数,它也是该函数的本地参数.
使这些变量特殊的原因不是它们的名称(你可以将它们称为任何你想要的东西),而是作为python中实例方法的第一个参数,它们获得对它们被称为它们的值的对象的引用. (再次阅读最后一句话,这是理解这一点的关键,你可能不会第一次得到它.)

现在,在Cat中,您有一行代码根本不在函数中.此时没有任何内容,包括自我,这就是失败的原因.如果您要在Cat中定义一个带有名为self的参数的函数,则可以引用该参数.如果该参数碰巧是Cat上的实例方法的第一个参数,那么它将具有调用它的Cat实例的值.否则,它将传递给它的任何东西.

*你明智地选择了!

点赞