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. 我可以在不重定向的情況下重寫URL嗎?
- 2. 我可以在不使用IDE的情況下發布嗎?
- 3. 我可以在不使用Composer的情況下安裝Laravel嗎?
- 4. 我可以在不安裝的情況下使用git嗎?
- 5. 我可以在不編譯DLL的情況下在ASP.NET網站中編寫一個類嗎?
- 6. 我可以在不重寫子類的情況下使用超類中的方法嗎?
- 7. 我可以在我的情況下使用ASP.NET MVC Partial嗎?
- 8. 我可以在不登錄的情況下應用gsettings嗎?
- 9. 我可以在沒有CALayers的情況下使用Core Animation嗎?
- 10. 我可以在沒有Node.js的情況下使用Tumblr.js嗎?
- 11. 我可以在沒有Zend_Application的情況下使用zfdebug嗎?
- 12. 我可以在沒有SharePoint的情況下使用K2 Blackpearl嗎?
- 13. 我們可以在if-else的情況下使用(id)嗎?
- 14. 我可以在不使用中鍵的情況下使Excel順利滾動嗎?
- 15. 我可以在不提供樣品的情況下用CsvProvider書寫標題嗎?
- 16. 我可以在沒有IBM Cognos Transformer的情況下自己編寫mdc嗎?
- 17. 我可以在不使用API的情況下在BigCommerce中創建webhook嗎?
- 18. 我可以在不使用UITableView的情況下使用NSFetchedResultsController
- 19. 我們可以在不使用CTE的情況下編寫相同的查詢嗎?
- 20. 我可以在不使用演員/精靈的情況下編寫一個現代/優秀的遊戲嗎
- 21. 可以在不引入Tuple的情況下編寫TreeBuilder函數嗎?
- 22. 我可以在不使用Hibernate映射的情況下使用Hibernate Criteria嗎?
- 23. 我可以在不使用全屏視圖的情況下使用iOS GLKit嗎?
- 24. 我可以在不使用getId()和getVersion()方法的情況下使用RequestFactory嗎?
- 25. 我可以在沒有__init__的情況下訪問某個類嗎? - Python
- 26. 是否可以在不使用頭文件的情況下編寫c程序
- 27. 是否可以在不使用遞歸的情況下編寫JSON解析器?
- 28. 我可以在不修改'this'的情況下使用jquery的'bind'嗎?
- 29. 我可以在不使用chromedriver.exe的情況下將Selenium(webdriver)用於Chrome嗎?
- 30. 在任何情況下,我可以阻止iPhone使用3G嗎?
如果你關心的是抽象方法的檢查,那麼是的。但是abcs也支持[虛擬子類註冊](https://docs.python.org/3/library/abc.html#abc.ABCMeta.register)。 –
@MartijnPieters是的,我的意思是指定我關心的是檢查抽象方法。 –
不知道爲什麼這個問題是downvoted ... –