我正在尝试从定义了@classmethod的类创建一个子类:
class Pet(object):
def __init__(self,animal):
self.animal = animal
@classmethod
def wild(cls,animal):
return cls('wild '+animal)
class Cat(Pet):
def __init__(self):
Pet.wild('cat')
if __name__ == '__main__':
print Cat().animal
这给了我以下错误:
print Cat().animal
AttributeError: Cat instance has no attribute 'animal'
可能我并不完全理解子类化的概念,我也试图将self
传递给Pet.wild
而不会取得更多成功。任何帮助都会非常感激!
修改
我试着解释一下我想做什么:我想使用classmethod Pet
从Cat
子类初始化parentclass(或superclass?)wild
而不是__init__
1}}。这可能吗?谢谢
答案 0 :(得分:1)
这是因为你没有调用super来正确地从你的基类继承。所以,这样做:
Pet.wild('cat')
没有达到你的预期。
class Pet(object):
def __init__(self,animal):
self.animal = animal
@classmethod
def wild(cls,animal):
return cls('wild '+animal)
class Cat(Pet):
def __init__(self):
super(Cat, self).__init__('cat')
if __name__ == '__main__':
print Cat().animal
答案 1 :(得分:0)
因此,如果您想要添加继承并在以后扩展Cat,那么您将如何做到这一点。有关__new__
和__init__
class Pet(object):
def __init__(self, animal):
self.animal = animal
@classmethod
def wild(cls, animal):
obj = cls.__new__(cls)
obj.animal = "wind " + animal
return obj
class Cat(Pet):
pass
if __name__ == "__main__":
print Pet.wild("cat").animal
cat = Cat.wild("cat")
house_cat = Cat("cat")
print house_cat.animal, cat.animal
以下是有关内容的内容。 Cat也继承了wild
类方法。因此,您无需从Pet.wild
构造函数中调用Cat
。您只需直接在wild
上调用Cat
类方法即可。 cls
获取Cat
类,因此创建的对象将是Cat
实例,而不是Pet
实例。但是,在某些时候,您将不得不在构造函数中覆盖一些默认行为,这涉及一定数量的编码。