Python描述符
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python描述符,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2000字,纯文字阅读大概需要3分钟。
内容图文
![Python描述符](/upload/InfoBanner/zyjiaocheng/772/547196c83ffb4c33aa771cc26dab3328.jpg)
命名空间
每个对象都有__dict__属性,字典类型;存储的是对象的属性信息.
对象属性的访问顺序: 很重要
1. 实例属性
2. 类属性
3. 父类属性
4. __getattr__()方法
实例属性和类属性是在不同的命名空间的,即使拥有相同的属性名,也互补影响.
描述符协议
描述符是类级别的方法协议,和实例无关
如果一个类实现了一下成员函数,则类便是描述符:
__get__(self, instance, owner)
==>
self:描述符类实例(描述符类实例对象)
instance:调用描述符的对象实例(调用描述符的实例)
owner:最高统治者,拥有描述符的对象(调用描述符的实例的基类)
__set__(self, instance, value)
__del__(self,instance)
- 示例代码
# 代码1 class Desc: ''' 描述符类 ''' def __get__(self, instance, owner): print("__get__...") print("self: ", self) print("instance: ", instance) print("owner: ", owner) def __set__(self, instance, value): print("__set__...") print("self: ", self) print("instance: ", instance) class TestDesc: ''' 测试类 ''' x = Desc() ? 测试代码 t = TestDesc() t.x # 此处会调用Desc类__get__方法 self:__main__.Desc instance: __main__.TestDesc owner: class '__main__.TestDesc'
为什么访问t.x时候,会直接去调用描述符的__get__方法呢?
==>
因为t为实例,访问t.x时,调用顺序为:
首先访问owner的__getattribute__()方法(TestDesc.__getattribute__()),访问owner实例对象的__dict__,发现没有,然后来父类owner找,找到了~
其次,判断属性x为描述符,访问顺序会变成:
TestDesc.x --> TestDesc.__dict__['x'].__get__(None,TestDesc) --> 进入Desc的__get__方法,获取属性x
描述符对象x其实是类TestDesc类属性,那么可不可以将它变成实例属性?
由代码2可知,要是描述符存在于__init__构造函数(实例属性),是不会被调用的.
原因:
– 访问t.y,调用TestDesc.getattribute(), 该方法将t.y转化为TestDesc.dict[‘y’].get(t.TestDesc),没有找到,因此会失败
```
# 代码2
class Desc:
''' 描述符类 '''
def __init__(self, name):
self.name = name
def __get__(self, instance, owner):
print("__get__...")
print("name: ", self.name)
class TestDesc:
''' 测试类 '''
x = Desc('x') # 类属性
def __init__(self,):
self.y = Desc('y')
# 测试代码
t = TestDesc()
t.x
t.y
# 输出结果
__get__...
name: x
```
如果类属性描述符和实例属性描述符同名,怎么办?
内容总结
以上是互联网集市为您收集整理的Python描述符全部内容,希望文章能够帮你解决Python描述符所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。