Python中的参数化继承?

Pav*_*ari 4 python inheritance python-3.6

我很好奇是否有更好的方法来实现这样的目标?我的意图是避免不必要的样板.提供的示例显然非常简单,让其他人了解我的想法.

def create_parametrized_class(animal):
    class SomeClass:
        def __init__(self, name):
            self.name = name

        def __str__(self):
            return "{}: {}".format(animal, self.name)

    return SomeClass

class Cat(create_parametrized_class("Cat")):
    pass

class Dog(create_parametrized_class("Dog")):
    pass

cat = Cat("Micka")
dog = Dog("Rex")
assert str(cat) == "Cat: Micka", "Cats..."
assert str(dog) == "Dog: Rex", "Dogs..."
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

我将假设type(self).__name__这里不够(对于你的示例类,值等于你传入的参数值).

要在类定义时设置每个类的值,从Python 3.6开始,您可以使用__init_subclass__classmethod:

class Animal:
    def __init_subclass__(cls, animal_name, **kw):
        super().__init_subclass__(**kw)
        self._animal_name = animal_name

    def __str__(self):
        return "{}: {}".format(self._animal_name, self.name)


class Cat(Animal, animal_name='Cat'):
    pass

class Dog(Animal, animal_name='Dog'):
    pass
Run Code Online (Sandbox Code Playgroud)

__init_subclass__调用所有新的子类,并class Subclass(...)在行中指定的任何参数都传递给该方法,让您参数化该特定的子类.