python-如何将__getattr__的示例理解为元类方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-如何将__getattr__的示例理解为元类方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1751字,纯文字阅读大概需要3分钟。
内容图文
这是Mark Lutz的书“ Learning Python”的示例片段.我发现很难理解如何将名称访问转换为元类中的getattr()调用:
>>> class A(type):
def __getattr__(cls, name):
return getattr(cls.data, name)
>>> class B(metaclass=A):
data = 'spam'
>>> B.upper()
'SPAM'
>>> B.upper
<built-in method upper of str object at 0x029E7420>
>>> B.__getattr__
<bound method A.__getattr__ of <class '__main__.B'>>
>>> B.data = [1, 2, 3]
>>> B.append(4)
>>> B.data
[1, 2, 3, 4]
>>> B.__getitem__(0)
1
>>> B[0]
TypeError: 'A' object does not support indexing
我有以下问题:
> B.upper()如何产生“ SPAM”?是因为B.upper()=> A .__ getattr __(B,upper())=> getattr(B.data,upper())?但是类似getattr(‘spam’,upper())之类的调用会出现错误“ NameError:名称’upper’未定义”
> B.upper会通过什么路径到达位于<0x029E7420>处的str对象的<内置方法上部.它也会通过getattr吗,参数的真实值是什么?
> B.append(4)是否通过A .__ getattr __(cls,name)?如果是,在这种情况下,getattr(cls.data,name)中参数的真实值是什么?
> B .__ getitem __(0)如何产生1?在这种情况下,getattr(cls.data,name)中参数的真实值是什么?
解决方法:
> B.upper()首先查找B.upper,然后不带任何参数调用它.通过按一定顺序尝试几个选项来查找B.upper,最终尝试键入(B).__ getattr __(B,’upper’),在这种情况下为A .__ getattr __(B,’upper’),它返回’垃圾邮件.
>如上所述,B.upper经历了几种选择,在这种情况下到达类型(B).__ getattr __(B,’upper’),即A .__ getattr __(B,’upper’).
>是的,在这种情况下,B.append将到达A .__ getattr __(B,’append’),它将返回B.data.append.
> B .__ getitem __(0)在这种情况下将查找B .__ getitem__并通过A .__ getattr __(B,’__getitem__’)找到它,它将返回B.data .__ getitem__.
另外,请注意最后一个示例B [0]不起作用,因为B类没有直接定义__getitem__方法.这是因为通过特殊语法(例如B [0])使用“特殊”方法(例如__getitem__)时,会以不同的方式查找.
内容总结
以上是互联网集市为您收集整理的python-如何将__getattr__的示例理解为元类方法全部内容,希望文章能够帮你解决python-如何将__getattr__的示例理解为元类方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。