Python中__dict__有什么用

发布时间:2021-12-17 15:12:43 作者:iii
来源:亿速云 阅读:146

本篇内容介绍了“Python中__dict__有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Python这门编程语言的最大的好处就是其语言的动态性带来编程的便利性,不像静态语言那样死板,比如它可以运行期动态添加类定义时没有的属性,例如:

class A:
    def __init__(self):
        self.name = 'zhang'
    def eat(self):
        print('eat')
a = A()
a.age = 10
print(a.age)

在Java中这段代码可定是没法通过编译的,但在Python中这样的操作不再是司空见惯的事情,那Python解释器在背后究竟做了什么操作呢?答案是__dict__,Python中的所有内建(build-in)数据类型(type)都有属性__dcit__,当然自定义的类(class)也有,因为自定义的类也是一种数据类型嘛。在a.age=10前后分别加上一行print a.__dict__可以得到结果:

{'name': 'zhang'}
{'age': 10, 'name': 'zhang'}
10

不难看出,在运行期和类定义期所定义的实例对象属性放在该对象的 __dict__属性中,接下来在a=A()后面加上几行代码:

A.country = "China"
print a.country
print a.__dict__

得到结果:

China
{'age': 10, 'name': 'zhang'}

对象a的__dict__属性中并没'country'这个属性,那它是哪来的呢?那么不妨打印类对象A的__dict__看看:

print a.country
print a.__dict__
print A.__dict__

输出结果:

China
{'age': 10, 'name': 'zhang'}
{'country': 'China', '__module__': '__main__', 'eat': <function eat at 0x104e3b230>, ...省略}

这下应该明白了,在运行期间,定义的实例对象(a)的属性是放在a.__dict__中,而定义的类对象(A)的属性是放在A.__dict__中,那为什么实例对象a是怎么访问到country属性的呢? Python中是这样约定的,以obj.attr访问时,它会按照如下顺序去查找:

  1. 对象自身,obj.__dict__['attr']

  2. 对象类型,obj.__class__.__dict__['attr']

  3. 对象类型的基类,obj.__class__.__bases__中的所有__dict__['attr']。注意,当多重继承的情况下有菱形继承的时候,Python会根据MRO确定的顺序进行搜索。

如果在基类都还没找到要访问的属性时,Python解释器就会跑出一个异常:AttributeError。那么问题来了,我们是否可以给内建(build-in)类型添加一些自定义的属性呢?比如:

list.myExtension = lambda self,x:x * 2
list.myExtension(10)

运行的时候,解释器会报错:TypeError: can't set attributes of built-in/extension type 'list',那能否向list的__dict__属性中添加一个值呢?

list.__dict__['myExtension'] = lambda self, x:x * 2

还是一样,没法运行:TypeError: 'dictproxy' object does not support item assignment,细细思来,后者不能运行也是符合情理的,两者就是等价的东西,那为什么不允许程序员扩展内建类型呢?

后面那位睡觉的同学你来回答一下,答曰:Guido van Rossum老爹是用C语言来实现的这些类型,你是没法再修改的,那如何优雅地扩展已有类型呢?知道OOP的同学都会用继承的方式来做。于是那位同学继续睡觉去了。

“Python中__dict__有什么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. python中in有什么用
  2. python中dir()与__dict__属性有什么区别

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:怎么把自己的开源项目发布到Pypi服务器

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》