简单python继承 为什么我的cattom=cat()没有nlegs属性 我们是应该明确地从Cat.\uuuuuu init\uuuuuuuu>内部调用Animal.\uuuuu init(),还是应该做一些更奇特的事情,比如说,使用super 如果我想创建一个有5条腿的cat,我是否需要向cat.\uuuuu init\uuuu接口添加额外的参数

简单python继承 为什么我的cattom=cat()没有nlegs属性 我们是应该明确地从Cat.\uuuuuu init\uuuuuuuu>内部调用Animal.\uuuuu init(),还是应该做一些更奇特的事情,比如说,使用super 如果我想创建一个有5条腿的cat,我是否需要向cat.\uuuuu init\uuuu接口添加额外的参数,python,inheritance,constructor,Python,Inheritance,Constructor,您需要查看关于的Python文档。例如,您通常会通过调用super(Cat,self)来开始(或结束)您的Cat.\uuu init\uu()方法 要建立在其他人所说的基础上,是的,您需要调用父级的\uuuu init\uuu方法 一般来说,最好使用super。然而,在某些情况下(特别是当您从多个类继承时),这可能是一个大难题。我将避免谈论细节,这里不缺少细节。(另外,其他一些“特殊”函数也有一些奇怪之处。例如,您可以执行super(SomeCls,self)。\uuuu getitem\uuu

您需要查看关于的Python文档。例如,您通常会通过调用
super(Cat,self)来开始(或结束)您的
Cat.\uuu init\uu()
方法


要建立在其他人所说的基础上,是的,您需要调用父级的
\uuuu init\uuu
方法

一般来说,最好使用super。然而,在某些情况下(特别是当您从多个类继承时),这可能是一个大难题。我将避免谈论细节,这里不缺少细节。(另外,其他一些“特殊”函数也有一些奇怪之处。例如,您可以执行
super(SomeCls,self)。\uuuu getitem\uuuuuu5)
但是
super(SomeCls,self)[5]
不起作用。)

作为一个简单的例子来说明为什么使用它是一个好主意,您可以让
继承自
哺乳动物
(继承自
动物
),而不必在代码中更改除了从哪个类
继承之外的其他位置

至于为什么您的
tom
实例没有
tom.nlegs
,这是因为您没有调用
Animal
\uu init\uu
方法

还请记住,并非所有内容都需要在初始化时设置。对于本例,在
\uuu init\uuu
方法中不设置类似
nlegs
的内容更有意义。相反,只需直接在类中设置它。例如

class Cat(Animal):
    def __init__(self, talk='meow', num_legs=4):
        print 'Hay cat'
        self.talk = talk
        super(Cat, self).__init__(num_legs)


tom = Cat()  #tom is a normal cat
bob = Cat('Nyan', 3) #bob is a japanese defective cat
基本上,如果某件事情可能在不同的实例之间发生变化(例如,cat的颜色)或需要在初始化时进行(例如,打开文件),则可能应该在
\uuuu init\uuu
中进行设置

否则,如果我们希望该类的任何实例都是相同的,那么直接在类定义中设置它会更简洁


此外,以这种方式设置的属性将可用于文档工具(例如内置的
帮助
功能),而在初始化时设置的属性将不可用。

谢谢!那么为什么在这个例子中直接在类中设置更有意义呢?你能澄清一下什么时候在初始化时设置属性更好,什么时候在类定义时更好吗?@wim-我添加了一些编辑来澄清一些事情。简而言之,如果每个实例都会发生变化,那么在
\uuuu init\uuu
构造函数中进行设置。否则,请简化
\uuuu init\uuuu
函数,并直接在类定义中设置它。希望有帮助!我不认为每种动物都有四条腿(有些没有)。所以,它不应该是动物类的一部分。@JBernardo-这是真的,很有道理!我把它改成了哺乳动物类。除了像鲸鱼这样的特殊情况(它们仍然有腿,只是变成了退化的内部骨骼),大多数(未受伤/变异的)哺乳动物都有4条腿,所以这更合适。是的。如果派生类没有定义父方法,则使用父方法
\uuuuu init\uuuu
。您不需要对
对象执行任何操作。
class Cat(Animal):
    def __init__(self, talk='meow', num_legs=4):
        print 'Hay cat'
        self.talk = talk
        super(Cat, self).__init__(num_legs)


tom = Cat()  #tom is a normal cat
bob = Cat('Nyan', 3) #bob is a japanese defective cat
class Mammal(object):
    nlimbs = 4
    def __init__(self):
        print "I'm a mammal!"

class Cat(Mammal):
    def __init__(self, color="calico"):
        self.color = color
        super(Cat, self).__init__()
        print "I have {0} legs I am {1}".format(self.nlimbs, self.color)

class FiveLeggedCat(Cat):
    nlimbs = 5