python - 抽象类可以强制继承类将方法实现为静态吗?

标签 python abstract-class

Python 3.2 以防万一...

下面的代码表明“具体类”可以将 some_method 实现为静态方法或实例方法:

import abc

class SomeAbstractClass(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def some_method(self): pass

class ValidConcreteClass1(SomeAbstractClass):

    @staticmethod
    def some_method():
        print("foo!")

class ValidConcreteClass2(SomeAbstractClass):

    def some_method(self):
        print("foo!")

ValidConcreteClass1.some_method()

instance = ValidConcreteClass2()
instance.some_method()

我的问题是,我可以在继承类中强制 some_method 的实现是静态的吗?

我注意到@abc.abstractstaticmethod 并认为这就是答案,但以下代码仍然运行良好。我认为它会拒绝 ValidConreteClass2 因为 some_method 不是静态的:

import abc

class SomeAbstractClass(metaclass=abc.ABCMeta):

    @abc.abstractstaticmethod
    def some_method(self): pass

class ValidConcreteClass1(SomeAbstractClass):

    @staticmethod
    def some_method():
        print("foo!")

class ValidConcreteClass2(SomeAbstractClass):

    def some_method(self):
        print("foo!")

ValidConcreteClass1.some_method()

instance = ValidConcreteClass2()
instance.some_method()

最佳答案

我认为需要澄清一下;

首先,在 Python 中,每个方法都是虚拟的——真正的虚拟;因此,无论方法是静态的,还是绑定(bind)到类或实例的,都是子类的问题,而不是父类的问题。您没有真正的理由想要阻止这种情况 - 您的目的是什么?

其次,ABC 在实例化时检查抽象性 - 如果您尝试实例化一个仍然具有任何抽象方法的类,则会引发错误。但是 ABC 不能对从类本身调用的静态方法或类方法执行任何操作——没有对方法本身执行检查,只是在方法上设置了一个属性——当类被实例化时,ABCMeta 会做脏活。

第三,abstractstaticmethod 的目的是允许一个抽象方法——因此仍然必须被子类以某种方式覆盖的东西——是静态的并且可以从任何地方使用——同样,没有对方法本身进行检查,所以下面代码是完全合法的:

import abc

class SomeAbstractClass(metaclass=abc.ABCMeta):

    @abc.abstractstaticmethod
    def some_method(): 
        return 123

class ValidConcreteClass1(SomeAbstractClass):

    def some_method(self):
        return 456

inst = ValidConcreteClass1()
print(inst.some_method())
print(SomeAbstractClass.some_method())

abstractstaticmethod/abstractclassmethod 存在的唯一原因是以下内容不起作用,因为装饰方法缺少 dict

class NotWorking(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    @staticmethod
    def some_method(self):
        return "asd"

最后一件事: 如果你真的想要,你可以通过扩展 ABCMeta 添加这样的功能,但我不会告诉你如何做到这一点,除非你告诉我你为什么这样做:-)

关于python - 抽象类可以强制继承类将方法实现为静态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437792/

相关文章:

python - webapp2 与 python3

python - Pandas : histogram with fixed width

Python抽象方法默认逻辑,super()方法

C++ - 无法实例化抽象类

java - 如何区分设计模式和标准多态性

python - Numpy 分区对角矩阵

python - 如何循环遍历日期列并根据特定条件赋值?

python - 是否有一种内置方法可以将无参数函数转换为生成器?

actionscript-3 - AS3-抽象类

c# - 用具体类型覆盖抽象方法