簡體   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