Python将常量参数传递给基类

时间:2017-02-22 16:58:22

标签: python templates generics inheritance abstraction

Q值。我应该如何将 常量 参数传递给Python基类?

使用典型示例,我有类DogAnimal(都来自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

但是现在,由于我的动物都非常安静,当其他人出现并且在没有阅读我精心编写的文档的情况下编写Animal课程时很容易错过,并且只发现他们忘记了一次蓝色的方法实际调用方法时的月亮。

理想情况下,我喜欢像C ++这样的模板,其中template<sound> class Animal() . . . 类本身采用参数 - 它不会错过而不会立即出错,并且每个实例不会占用更多空间。

def stringBuilder(array, xLine, yLine):        
     StringA, StringB = "", ""
     i, j = len(xLine), len(yLine)
     minCost = array[i][j]
     while (i != 0 and j != 0):
        minCost = min(array[i - 1][j], array[i][j - 1], array[i - 1][j- 1])
        if (minCost == array[i - 1][j - 1]):
           StringA += xLine[i - 1]
           StringB += yLine[j - 1]
           array[i - 1][j - 1] = 0
           i -= 1
           j -= 1
        elif (minCost == array[i][j - 1]):
           StringA += '-'
           StringB += yLine[j - 1]
           array[i][j - 1] = 0
           j -= 1
        elif (minCost == array[i - 1][j]):
           StringA += xLine[i - 1]
           StringB += '-'
           array[i - 1][j]= 0
           i -= 1 

有没有办法在Python中完成我以后的工作?

1 个答案:

答案 0 :(得分:0)

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

pointer

上面的代码产生以下输出

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") 创建新动物,这应该可行。