python教程—抽象属性(不是属性)?-Python实用宝典

python教程—抽象属性(不是属性)?

定义抽象实例属性而不是属性的最佳实践是什么?我想这样写:

定义抽象实例属性而不是属性的最佳实践是什么?

我想这样写:

    class AbstractFoo(metaclass=ABCMeta): @property @abstractmethod def bar(self): pass class Foo(AbstractFoo): def __init__(self): self.bar = 3

而不是:

    class Foo(AbstractFoo): def __init__(self): self._bar = 3 @property def bar(self): return self._bar @bar.setter def setbar(self, bar): self._bar = bar @bar.deleter def delbar(self): del self._bar

属性很方便,但是对于不需要计算的简单属性来说,它们是多余的。这对于将由用户子类化和实现的抽象类尤其重要(我不想强迫某人使用@property,因为他本来可以编写self。foo = _init__中的foo)。

>抽象属性在Python中 question提出的唯一答案是使用@property和@abstractmethod:它没有回答我的问题。

通过AbstractAttribute获得抽象类属性的ActiveState配方可能是正确的方法,但我不确定。它还只处理类属性,而不处理实例属性。

回答

如果您真的想强制子类定义给定的属性,您可以使用元类。就我个人而言,我认为这可能有点过火了,也不是很像蟒蛇,但你可以这样做:

    class AbstractFooMeta(type): def __call__(cls, *args, **kwargs): """Called when you call Foo(*args, **kwargs) """ obj = type.__call__(cls, *args, **kwargs) obj.check_bar() return obj class AbstractFoo(object): __metaclass__ = AbstractFooMeta bar = None def check_bar(self): if self.bar is None: raise NotImplementedError('Subclasses must define bar') class GoodFoo(AbstractFoo): def __init__(self): self.bar = 3 class BadFoo(AbstractFoo): def __init__(self): pass

Basically the meta class redefine __call__ to make sure check_bar is called after the init on an instance.

    GoodFoo()  # ok BadFoo ()  # yield NotImplementedError

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论