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

2024-10-01 09:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

Python3.2以防重要。。。在

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

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()

我的问题是,我是否可以强制某些方法在继承类中的实现是静态的?在

我注意到了@抽象静态法并认为这是答案,但下面的代码仍然运行得很好。我认为它会拒绝validConretClass2,因为某些方法不是静态的:

^{pr2}$

Tags: 方法instance代码selffoodef静态some
1条回答
网友
1楼 · 发布于 2024-10-01 09:22:27

我认为需要澄清一下

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

第二,ABC在实例化时检查抽象性—如果您尝试实例化一个仍然有抽象方法的类,则会引发错误。但是ABCs不能对从类本身调用的静态方法或类方法做任何操作-没有对方法本身执行检查,只对方法设置一个属性-当类被实例化时,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

^{pr2}$

最后一件事: 如果您真的愿意,您可以通过扩展ABCMeta来添加这样的功能,但是除非您告诉我为什么要这样做,否则我不会给您提供一个如何实现这一点的钩子:-)

相关问题 更多 >