gpt4 book ai didi

python - 简单的python继承

转载 作者:太空狗 更新时间:2023-10-29 18:24:41 24 4
gpt4 key购买 nike

class Animal(object):
def __init__(self, nlegs=4):
print '__init__ Animal'
self.nlegs = nlegs

class Cat(Animal):
def __init__(self, talk='meow'):
print '__init__ Cat'
self.talk = talk

class Dog(Animal):
def __init__(self, talk='woof'):
print '__init__ Dog'
self.talk = talk
  1. 为什么我的猫 tom = Cat() 没有 nlegs 属性?
  2. 我们应该从 Cat.__init__ 中显式调用 Animal.__init__(),还是应该做一些更奇特的事情,比如,使用 super?
  3. 如果我想创建一只有 5 条腿的猫,我是否需要向 Cat.__init__ 接口(interface)添加额外的参数?

最佳答案

要以其他人所说的为基础,是的,您需要调用父级的 __init__ 方法。

一般最好用super。但是,在某些情况下(特别是当您从多个类继承时),它可能是一个大问题。我会避免详细说明,不乏various articles which discuss it . (此外,其他一些“特殊”功能也有一些奇怪之处。例如,您可以执行 super(SomeCls, self).__getitem__(5) 但是 super(SomeCls, self )[5] 将不起作用。)

作为使用它的一个好主意的简单示例,您可以使 DogCat 继承自 Mammal(它继承来自 Animal),除了 DogCat 继承自的类之外,无需更改代码中的位置。

至于为什么你的tom实例没有tom.nlegs,是因为你没有调用Animal >__init__ 方法。

还要记住,并不是所有的事情都需要在初始化时设置。对于此示例,不在 __init__ 方法中设置诸如 nlegs 之类的内容更有意义。相反,直接在类中设置它。例如

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

基本上,如果某些东西可能在实例之间发生变化(例如猫的颜色)或需要在初始化时完成(例如打开文件),那么它可能应该在 __init__

否则,如果我们希望类的任何实例都相同,直接在类定义中设置它会更清晰。

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

关于python - 简单的python继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6381590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com