Python:如何使用classmethod子类化类

时间:2015-11-18 16:25:08

标签: python class subclass

我正在尝试从定义了@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 PetCat子类初始化parentclass(或superclass?)wild而不是__init__ 1}}。这可能吗?谢谢

2 个答案:

答案 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__

之间的区别,请参阅this post
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实例。但是,在某些时候,您将不得不在构造函数中覆盖一些默认行为,这涉及一定数量的编码。