深刻理解Python中的元类(metaclass)(转)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了深刻理解Python中的元类(metaclass)(转),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1349字,纯文字阅读大概需要2分钟。
内容图文
![深刻理解Python中的元类(metaclass)(转)](/upload/InfoBanner/zyjiaocheng/832/adafa130613443be99aeb51bfeb808ad.jpg)
转载地址:http://blog.jobbole.com/21351/
另外有几点理解记录下:
创建一个实例时,有时会传入参数,这些参数会同时传入 __init__() 和 __new__(),如:
class Teacher(object): def __init__(self, *args, **kwargs): print("enter __init__") print(args) def __new__(cls, *args, **kwargs): print("enter __new__") print(args) return super(Teacher, cls).__new__(cls) wang = Teacher('xiaohong', 'xiaoming') 打印结果: enter __new__ ('xiaohong', 'xiaoming') enter __init__ ('xiaohong', 'xiaoming')
所以在如下代码中
class UpperAttrMetaclass(type): def __new__(cls, future_class_name, future_class_parents, future_class_attr): attr = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__')) uppercase_attr = dict((name.upper(), value) for name, value in attr) # return super(UpperAttrMetaclass, cls).__new__(cls, future_class_name, future_class_parents, uppercase_attr) return type(future_class_name, future_class_parents, uppercase_attr) Foo2 = UpperAttrMetaclass('Foo2', (), {'bar': 'bip'}) print(Foo2.BAR) 结果:bip
Foo2 = UpperAttrMetaclass('Foo2', (), {'bar': 'bip'})实例化一个类对象时,三个参数实际也传给了 __new__ ,之前一直以为实例化对象时传进的参数只能是 __init__方法接收,
看来理解是不对的,所以使用type(future_class_name, future_class_parents, uppercase_attr)创建一个类时,三个参数也应该是传递给了type的__new__方法,这样才能通过__new__
方法使用三个实参构造一个类对象出来
内容总结
以上是互联网集市为您收集整理的深刻理解Python中的元类(metaclass)(转)全部内容,希望文章能够帮你解决深刻理解Python中的元类(metaclass)(转)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。