考慮下面的示例代碼:抽象屬性不強制
from abc import ABC, abstractmethod, abstractproperty
class Base(ABC):
@abstractmethod
def foo(self) -> str:
print("abstract")
@property
@abstractmethod
def __name__(self) -> str:
return "abstract"
@abstractmethod
def __str__(self) -> str:
return "abstract"
@property
@abstractmethod
def __add__(self, other) -> str:
return "abstract"
class Sub(Base):
def foo(self):
print("concrete")
def __str__(self):
return "concrete"
def __add__(self, other) -> str:
return "concrete"
sub = Sub()
sub.foo()
sub.__name__
print(str(sub))
注意,子類沒有實現抽象屬性__name__
,而事實上當__name__
被引用,它打印從其父「抽象」 :
>>> sub.foo()
concrete
>>> sub.__name__
'abstract'
>>> print(str(sub))
concrete
然而,這不是因爲__name__
是dunder方法,也不會因爲某些問題@property
和@abstractmethod
裝飾效果不好在一起,因爲如果我雷莫從Sub
開始執行__add__
,它不允許我實例化它。 (我知道__add__
通常不是屬性,但我想使用'真正的'dunder方法)如果我刪除了__str__
和foo
的實現,則會出現相同的預期行爲。只有__name__
表現這種方式。
這是什麼導致這種行爲__name__
?有沒有辦法解決這個問題,還是我需要讓父(抽象)實現手動爲我提高TypeError
?
@Keozon:檢查,我很確定,因爲這個類型也有一個描述符。 –
有趣。我將不得不對此進行試驗。感謝您的信息! – Keozon