定义抽象实例属性而不是属性的最佳实践是什么?
我想写一些像:
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 = foo
它__init__
)。
Python问题中的抽象属性仅建议使用@property
和的答案@abstractmethod
:它不能回答我的问题。
通过抽象类属性的ActiveState配方AbstractAttribute
可能是正确的方法,但是我不确定。它也仅适用于类属性,不适用于实例属性。
如果您确实想强制子类定义给定的属性,则可以使用元类。就我个人而言,我认为这可能是矫kill过正,不是很Python,但是您可以执行以下操作:
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
基本上,重新定义元类__call__
以确保 check_bar
在实例的init之后被调用。
GoodFoo() # ok
BadFoo () # yield NotImplementedError
问题内容: 在Python中使用抽象属性实现以下Scala代码的最短/最优雅的方法是什么? Scala编译器强制使用的子类来定义“路径”。子类如下所示: 问题答案: Python有一个内置的异常,尽管直到运行时您都不会遇到该异常。
问题内容: 在以下代码中,我创建了一个基本抽象类。我希望所有继承自其的类都提供该属性,因此我将该属性设置为。 然后,我创建了一个名为的子类,该子类旨在提供一些功能,但仍保持抽象。中没有属性,但是python实例化了该类的对象而没有错误。一个人如何创建抽象属性? 问题答案: 从Python 3.3 开始,修复了一个错误,这意味着装饰器现在应用于抽象方法时,可以正确地标识为抽象。 注:订单的问题,你必
这肯定是个愚蠢的问题,但我对Kotlin真的是个新手,我没有找到任何解决办法。 如何声明类字段?就像我们可以在Java中拥有它一样: 在中: 但我得到一个警告:“属性必须初始化或抽象”
检索给定节点resp的所有属性名(而不是属性值!)的Xpath表达式看起来如何。xml标签? 假设以下XML文档: Xpath//title/@*会选择“eng,fr,easyreading”,但哪个Xpath会选择“lang,lang,type”?
我们可以使用AbstractMongoConfiguration(http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/config/AbstractMongoConfiguration.html)进行mongob配置。此外,我们可以使用application.prop