繁体   English   中英

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

[英]Can an abstract class force the inheriting class to implement a method as static?

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中,每种方法都是虚拟的-真正是虚拟的; 因此,方法是静态的还是绑定到类或实例的,这是子类的问题,而不是父类的问题。 您没有真正的理由要阻止这种情况-您的目的是什么?

其次,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())

存在抽象静态方法/抽象类方法的唯一原因是,以下方法不起作用,因为修饰的方法缺少字典

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

最后一件事:如果您确实愿意,可以通过扩展ABCMeta来添加此类功能,但是除非您告诉我为什么这样做,否则我不会给您带来任何困扰:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM