【发布时间】:2018-08-07 22:12:33
【问题描述】:
我真正想做的是这样的:
class X(metaclass=abc.ABCMeta):
@abc.abstractAttribute # this doesn't exist
var = [1,2]
class Y(X):
var = X.var + [3,4]
这将强制X 的任何子类实现静态var 属性。
但是没有办法将静态属性定义为抽象的。
尝试使用@abc.abstractmethod,结合属性,我可以接近:
class X(metaclass=abc.ABCMeta):
@property
@abc.abstractmethod
def var(self):
return [1,2]
class Y(X):
@property
def var(self):
return super().var + [3,4]
y=Y(); y.var 根据需要提供[1,2,3,4]。
但目标是创建静态属性/属性,而不是实例属性/属性。
当创建为@staticmethod 时:
class X(metaclass=abc.ABCMeta):
@property
@staticmethod
@abc.abstractmethod
def var():
return [1,2]
class Y(X):
@property
@staticmethod
def var():
return X.var + [3,4]
...然后y=Y(); y.var 给出TypeError 'staticmethod' object is not callable
如果我切换装饰器顺序,这将解决静态方法可调用错误:
class X(metaclass=abc.ABCMeta):
@staticmethod
@property
@abc.abstractmethod
def var():
return [1,2]
class Y(X):
@staticmethod
@property
def var():
return X.var + [3,4]
静态方法会起作用,但属性不会按预期运行:y=Y(); y.var 返回属性本身,<property at 0x2c16aa1b3b8>。
This answer 接近预期,但在这种情况下它不起作用,因为基类 X 已经有一个 var 属性(因此子类可以通过 super 访问)。
如何定义一个 Python 类以具有抽象的静态属性/属性?
【问题讨论】:
-
要拥有类级别(静态)属性,它需要属于元类。
-
另外,这个:
super(Y, Y).var肯定不行……
标签: python properties static attributes abstract-class