![](/img/trans.png)
[英]How to implement abstract class methods as static method in inherited class in python?
[英]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.