强制在python子类中实现特定属性

强制在python子类中实现特定属性,python,inheritance,interface,Python,Inheritance,Interface,我有一个父类,我想“强制”从它继承的每个人实现一些特定的类属性 我对方法没有这个问题,因为我创建了一个伪方法,它会引发NotImplementedError,这非常清楚 至于类属性——我不想在父类中创建它们并将它们设置为“无”,因为这不会迫使开发人员在子类中实现它们 演示当前情况的小代码: class Pet(object): name = None def make_noise(self): raise NotImplementedError("Needs t

我有一个父类,我想“强制”从它继承的每个人实现一些特定的类属性

我对方法没有这个问题,因为我创建了一个伪方法,它会引发
NotImplementedError
,这非常清楚

至于类属性——我不想在父类中创建它们并将它们设置为“无”,因为这不会迫使开发人员在子类中实现它们

演示当前情况的小代码:

class Pet(object):
    name = None

    def make_noise(self):
        raise NotImplementedError("Needs to implement in subclass")

    def print_my_name(self):
        print(self.name)

class Dog(Pet):
    # how to force declairing "name" attribute for subclasses?

    def make_noise(self):
        print("Whof Whof")
在本例中,开发人员1创建了Pet类,并希望其他开发人员使用“name”属性实现子类。 Developer2实现了一个子类,但不知道他需要实现“name”属性


有可能在python中创建这样的限制吗?

use可以使用python的
抽象基类
/
ABS
方法重写
,根据您的需求,可以使用元类或。 之后,您可以使用。 例如:


有了它,您还可以使用
@name.setter

添加一个setter。请参阅,向下滚动到文档以获取abstractmethod。我觉得名称应该与对象相关,如果是这样,您可以这样做。\ uu init\uuuu(name)。。。如果你想让某个文档将狗描述为一种类型,你可以使用。etc@ShengZhuang,是的,我倾向于同意,我想我没有这样做,因为在我的例子中,叶类(dog)不是父类(pet)的直接子类,所以我不想在所有其他父类的init中“拖动”该变量,但实际上为什么不呢?看起来真的很酷!在ABS和方法重写中,重点是方法而不是属性。我想如果我使用这种方法,我就必须实现一个set函数
class Pet(ABC):
    @abstractmethod
    @property
    def name(self)
        pass

    def make_noise(self):
        raise NotImplementedError("Needs to implement in subclass")

    def print_my_name(self):
        print(self.name)