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

在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与元类》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值