Python将常量参数传递给基类

2024-10-05 12:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我应该如何将常量参数传递给Python基类?你知道吗

使用典型示例,我有类CatDog(都是从Animal派生的)。 调用x.sound应该返回适当的单词("meow""woof")。你知道吗

我的问题是,类的所有实例发出相同的声音,因此,虽然我可以将sound传递给Animal

class Animal:
    def __init__( sound ):
        self.sound = sound

class Dog:
    def __init__():
        super().__init__( "woof" )

这似乎是浪费,因为我们在每一个实例中都存储"woof",而我有一百万只狗和十亿只猫。我可以用一种方法来代替:

class Animal:
    @staticmethod
    def sound():
        raise NotImplementedError("Abstract")

class Dog:
    @staticmethod
    def sound():
        return "woof"

但是现在,由于我的动物都非常安静,当其他人来编写一个Bird类而没有阅读我费尽心思编写的文档,并且在实际调用该方法时才发现他们偶尔忘记一次该方法时,很容易忽略这一点。你知道吗

理想的是,我喜欢C++的模板,其中^ {< CD3>}类本身接受参数——它不会被忽略而不会造成立即错误,并且不会占用每个实例更多的空间。你知道吗

template<sound>
class Animal()
    . . .

有没有办法实现我在Python中所追求的目标?你知道吗


Tags: 实例方法示例initdef基类classcat
1条回答
网友
1楼 · 发布于 2024-10-05 12:18:57

你可以尝试使用工厂设计模式。像这样:

class AnimalFactory(object):
    animals={}

    @staticmethod
    def registerAnimal(animalName, animalClass):
        if not hasattr(animalClass, "sound"):
            raise Exception("All animals need to make a sound")
        AnimalFactory.animals[animalName]=animalClass

    @staticmethod
    def createNewAnimal(animalName):
        return AnimalFactory.animals[animalName]()

class Dog:
    sound="woof"

AnimalFactory.registerAnimal("dog", Dog)

dog1=AnimalFactory.createNewAnimal("dog")
print dog1.sound

class Cat:
    pass

AnimalFactory.registerAnimal("cat", Cat)

上面的代码生成以下输出

woof
Traceback (most recent call last):
  File "animals.py", line 25, in <module>
    AnimalFactory.registerAnimal("cat", Cat)
  File "animals.py", line 7, in registerAnimal
    raise Exception("All animals need to make a sound")

当然,用户可能忘记注册类,但是只要其他用户使用AnimalFactory来创建新的动物,就可以了。你知道吗

相关问题 更多 >

    热门问题