Python:在类中创建抽象静态属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:在类中创建抽象静态属性相关的知识,希望对你有一定的参考价值。
我真正想做的是这样的事情:
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]
。
但目标是创建静态属性/属性,而不是实例属性/属性。
创建@static方法时:
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
如果我切换装饰器顺序,这将解决staticmethod可调用错误:
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类以具有抽象的静态属性/属性?
答案
如果你知道一种更传统的方法来解决这个问题,请告诉我,这也适用于使用__slots__
的类。但对于我的用例,以下内容将起作用:
class X:
var = [1,2]
def __init_subclass__(cls):
attr_name = 'var'
if not attr_name in cls.__dict__:
raise NotImplementedError(
"Attribute '{}' has not been overriden in class '{}'"
.format(attr_name, cls.__name__)
)
class Y(X):
# var = X.var + [3,4] # this will work
pass # this won't work
y = Y()
编辑:使用这种方法还有另一个缺点,即对于不覆盖的孙子女来说,这将是错误的错误:
class Y(X):
var = X.var + [3,4]
y = Y() # this works
class Z(Y):
pass
z = Z() # this errors
我会留下这个答案没有标记,因为有人建议一个更好的选择。
以上是关于Python:在类中创建抽象静态属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在类属性的Objective C中创建类似json的结构?