我真正想做的是:
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.抽象法,结合物业,我可以接近:
^{pr2}$y=Y(); y.var
根据需要给出{
但目标是创建静态属性/属性,而不是实例属性/属性。在
创建为@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
给出{
如果我切换decorator顺序,这将解决staticmethod 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类来拥有抽象的静态属性/属性?在
也许你的解决方案的一个变体可以工作-而不是使用dict简单地测试父类和子类的静态变量是否是同一个对象。 它适用于子代和插槽,但是折衷的是,如果您用None重写None,或者用同一个对象重写其他对象,那么它将抛出异常,因此它不是完美的。在
也许我忽略了一些重要的东西,但它在简单的用例中起作用。在
如果您知道解决这个问题的更传统的方法,请告诉我,这种方法也适用于使用
__slots__
的类。但是对于我的用例,下面的方法是可行的:编辑:使用这种方法还有另一个缺点,那就是对于那些没有覆盖的孙子们来说,这将是错误的:
^{pr2}$我将把这个答案留作空白,以便有人提出更好的替代方案。在
相关问题 更多 >
编程相关推荐