在python对象实际使用过程中,会对其对象的属性进行增删改查,那么这背后是对哪种类型的”数据结构“进行增删改查呢?
下面以Blog类进行说明
class Blog(object):
title = 'Python对象深度理解'
def __init__(self):
pass
# 进行实例化也即创建一个python对象
myFirstBlog = Blog()
# 对象属性的增
myFirstBlog.author='Pysenen'
print(myFirstBlog.author)
# 打印结果:Pysenen
# 对象属性的查
print(myFirstBlog.title)
# 打印结果:Python对象深度理解
# 对象属性的写(改)
myFirstBlog.title='新修改'
print(myFirstBlog.title)
# 打印结果:新修改
# 对象属性的删
del myFirstBlog.author
print(myFirstBlog.author)
# 打印结果:'Blog' object has no attribute 'author'
以上操作其实就是对 myFirstBlog这个对象里的__dict__数据结构进行操作
打印myFirstBlog.__dict__
{'author': 'Pysenen', 'title': '新修改'}
因此对对象的操作,其实就是对对象的__dict__属性操作
也即:
# 增
myFirstBlog.__dict__['author']='Python'
# 查
myFirstBlog.__dict__['title']
# 改
myFirstBlog.__dict__['title']='新的title'
# 删
myFirstBlog.__dict__.pop('author')
因此容易扩展,对对象的操作,可以转为使用字典的方式进行灵活操作,可回到大家熟悉的python字典数据结构的概念
batch_dict={
'name':'foo',
'age':'26',
'email':'test@gmail.com',
'company':'nonono'
}
myFirstBlog.__dict__=batch_dict
print(myFirstBlog.__dict__)
del myFirstBlog.__dict__
print(myFirstBlog.__dict__)
# 打印结果:{}
————分割线————
由于这篇文章写得时间比较早,其实还有涉及更深的内容:类对象或者实例的所有属性都放在一个字典里,这里背后其实是由元类type掌控着。
所有的类都是type元类创建,它创建类的方式 normal_class=type(class_name,class_bases,class_dict),这里的class_dict就是上面提到普通类的字典
例如上面定义的Blog类,用元类方式创建如下:
batch_dict={
'name':'foo',
'age':'26',
'email':'test@gmail.com',
'company':'nonono'
}
Blog=type('Blog',(object,),batch_dict)
In [1]: batch_dict={
...: 'name':'foo',
...: 'age':'26',
...: 'email':'test@gmail.com',
...: 'company':'nonono'
...: }
In [2]: Blog=type('Blog',(object,),batch_dict)
In [3]: Blog
Out[3]: __main__.Blog
In [4]: b=Blog()
In [5]: b.name
Out[5]: 'foo'
In [6]: b.age
Out[6]: '26'
In [7]: b.email
Out[7]: 'test@gmail.com'
In [8]: type(b)
Out[8]: __main__.Blog
本文内容相对容易理解,如果要深入挖掘元类,可以查阅本博客文章《 Python进阶——type与元类》