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)
我将假设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(...)在行中指定的任何参数都传递给该方法,让您参数化该特定的子类.