Python 3.6增加了PEP 487,其中增加了__init_subclass__
方法。是否有可能編寫不使用元類的ABC
版本?我可以在不使用Python 3.6中的元類的情況下編寫abc.ABC嗎?
回答
如果你關心的只是檢查抽象方法,那麼是的。只要將abstract method set computation到__init_subclass__
方法:
def __init_subclass__(cls):
super().__init_subclass__()
# Compute set of abstract method names
abstracts = {name
for name, value in vars(cls).items()
if getattr(value, "__isabstractmethod__", False)}
for base in cls.__bases__:
for name in getattr(base, "__abstractmethods__", set()):
value = getattr(cls, name, None)
if getattr(value, "__isabstractmethod__", False):
abstracts.add(name)
cls.__abstractmethods__ = frozenset(abstracts)
基礎object.__new__
implementation然後使用一個非空__abstractmethods__
設置爲阻止實例化。
但是ABC也支持virtual subclass registration; two hook methods this requires具有要在元類上實現。
如何實現對抽象方法的檢查? –
好吧,如果沒有使用元類,剩下的抽象方法可以阻止'__new__'中的實例化嗎? –
@NeilG:對不起,基礎的'object .__ new__'實現已經做到了。 –
- 1. 我可以在不寫函數的情況下使用scrollTop嗎?
- 2. 我可以在不重定向的情況下重寫URL嗎?
- 3. 我可以在不使用IDE的情況下發布嗎?
- 4. 我可以在不使用SqPaymentForm的情況下請求Card_Nonce嗎?
- 5. 我可以在不使用xterm的情況下啓動clisp嗎?
- 6. 我可以在不使用Composer的情況下安裝Laravel嗎?
- 7. 我可以在不安裝的情況下使用git嗎?
- 8. 在這種情況下,我可以使用匿名類型嗎?
- 9. 我可以在不編譯DLL的情況下在ASP.NET網站中編寫一個類嗎?
- 10. 我可以在不重寫子類的情況下使用超類中的方法嗎?
- 11. 我可以在我的情況下使用ASP.NET MVC Partial嗎?
- 12. 我可以在不運行MATLAB的情況下使用MATLAB編輯器嗎?
- 13. 我可以在沒有用戶的情況下使用oauth2嗎?
- 14. 我可以在不登錄的情況下應用gsettings嗎?
- 15. 你可以在不重寫mysql的情況下結合嗎?
- 16. 我可以在沒有Node.js的情況下使用Tumblr.js嗎?
- 17. aws - 我可以在沒有S3的情況下使用EC2嗎?
- 18. 我可以在沒有Eclipse的情況下使用BIRT嗎?
- 19. 我可以在沒有CALayers的情況下使用Core Animation嗎?
- 20. 我可以在沒有Zend_Application的情況下使用zfdebug嗎?
- 21. 我可以在沒有SharePoint的情況下使用K2 Blackpearl嗎?
- 22. 我們可以在if-else的情況下使用(id)嗎?
- 23. 我可以在不使用中鍵的情況下使Excel順利滾動嗎?
- 24. 我可以在不提供樣品的情況下用CsvProvider書寫標題嗎?
- 25. 我可以在沒有IBM Cognos Transformer的情況下自己編寫mdc嗎?
- 26. 我可以在沒有CURSOR的情況下編寫這個查詢嗎?
- 27. 我可以在不使用API的情況下在BigCommerce中創建webhook嗎?
- 28. 我可以在不使用UITableView的情況下使用NSFetchedResultsController
- 29. 可以在不使用Maven的情況下開發插件嗎?
- 30. 我們可以在不使用CTE的情況下編寫相同的查詢嗎?
如果你關心的是抽象方法的檢查,那麼是的。但是abcs也支持[虛擬子類註冊](https://docs.python.org/3/library/abc.html#abc.ABCMeta.register)。 –
@MartijnPieters是的,我的意思是指定我關心的是檢查抽象方法。 –
不知道爲什麼這個問題是downvoted ... –