简单python继承 为什么我的cattom=cat()没有nlegs属性 我们是应该明确地从Cat.\uuuuuu init\uuuuuuuu>内部调用Animal.\uuuuu init(),还是应该做一些更奇特的事情,比如说,使用super 如果我想创建一个有5条腿的cat,我是否需要向cat.\uuuuu init\uuuu接口添加额外的参数
您需要查看关于的Python文档。例如,您通常会通过调用简单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
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