yield-bytes

沉淀、分享与无限进步

Python对象的属性增删改查的实质

  在python对象实际使用过程中,会对其对象的属性进行增删改查,那么这背后是对哪种类型的”数据结构“进行增删改查呢?

下面以Blog类进行说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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

1
{'author': 'Pysenen', 'title': '新修改'}

点击并拖拽以移动

   因此对对象的操作,其实就是对对象的dict属性操作

也即:

1
2
3
4
5
6
7
8
9
10
11
# 增
myFirstBlog.__dict__['author']='Python'

# 查
myFirstBlog.__dict__['title']

# 改
myFirstBlog.__dict__['title']='新的title'

# 删
myFirstBlog.__dict__.pop('author')

点击并拖拽以移动

  因此容易扩展,对对象的操作,可以转为使用字典的方式进行灵活操作,可回到大家熟悉的python字典数据结构的概念

1
2
3
4
5
6
7
8
9
10
11
12
13
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类,用元类方式创建如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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与元类》