我真正想做的是这样的:
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 类?
最佳答案
如果它是一个属性的要求是灵活的,你可以只定义一个静态抽象方法:
class X:
@staticmethod
@abstractmethod
def var():
pass
class Y(X):
@staticmethod
def var():
return [1, 2]
>>> Y.var()
[1, 2]
关于Python:在类中创建抽象静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49022656/