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.varTypeError '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:在类中创建抽象静态属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 抽象类中创建抽象属性

静态变量或属性的Android性能

在抽象超类的静态方法中创建子类的实例? [复制]

如何在类属性的Objective C中创建类似json的结构?

python进阶三(面向对象编程基础)3-1 python中创建类属型

是否可以在 Python 中创建抽象类?