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 ... –