开发者学堂课程【Python 入门 2020年版:把对象当作字典操作】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10378
把对象当作字典操作
内容介绍:
一、字典使用
二、通过字典获取值
一、字典使用
新建一个 python 文件,命名为 05- 把对象当作一个字典使用
(1)写入代码:
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
p = Preson(‘张三’,18)
print(p.__dict__)
运行后的结果为:
说明 print(p.__dict__) 是将对象转换成字典
字典中可以进行如下的操作语句 p[‘name’] = ‘jack‘,同时加入新的属性语句 self.city = city,对象 p = Preson(‘张三’,18,‘襄阳‘)
整理代码内容:
class Person(object):
def __init__(self,name,age,city):
self.name = name
self.age = age
self.city = city
p = Preson(‘张三’, 18, ‘襄阳‘)
print(p.__dict__)
p[‘name’] = ‘jack‘
运行结果为:
虽然会正常打印出字典内容,但是在最后的语句中仍有错误
(2)出错的原因是,不能够直接把一个对象当作字典来使用。那么需要进行什么操作才可以当做字典使用?
在写完 p[‘name’] = ‘jack‘语句之后,可以先定义一个字典,系统有一个字典叫__dict__,可以写一个自己的字典模拟实践。[] 语法会调用对象的__setitem__方法,
书写方法代码:
def __setitem__(self,key,value):
print(‘setitem方法被调用
了’,key={},values={}’,format(key,value))
整理代码内容:
class Person(object):
def __init__(self,name,age,city):
self.name = name
self.age = age
self.city = city
def __setitem__(self,key,value):
print(‘setitem方法被调用
了’,key={},values={}’,format(key,value))
p = Preson(‘张三’, 18, ‘襄阳‘)
print(p.__dict__)
p[‘name’] = ‘jack‘
运行结果为:
(3)把 name 改为 jack 的写法
修改 def __setitem__方法,变为:
def __setitem__(self,key,value):
self.key = value
整理代码内容:
class Person(object):
def __init__(self,name,age,city):
self.name = name
self.age = age
self.city = city
def __setitem__(self,key,value):
self.key = value
p = Preson(‘张三’, 18, ‘襄阳‘)
print(p.__dict__)
p[‘name’] = ‘jack‘
运行结果为:
最后加入 print(p.name),得到运行结果为:
这时的打印会多出一个属性,p.key, 并没有改 name。
在 def __setitem__方法中,存在小小的问题,就是 key = ‘zhangsan’,如果现在通过给语句修改为 self[key] = value 后,会有很大的问题,运行后如下图。
会出现递归报错,原因是[]语法是调用__setitem__方法,现在在这个方法里又写了[],它就又需要调用,陷入到死循环中。
所以要赋值的话,应该采用先把对象转换为字典,然后字典里再写值。代码即为p.__dict__[key] = valu
整理代码内容:
class Person(object):
def __init__(self,name,age,city):
self.name = name
self.age = age
self.city = city
def __setitem__(self,key,value):
p.__dict__[key] = value
p[‘name’] = ‘japrint(p.name)
运行结果为:
如果写的是 self.name = value
,也是可以改的。但如果把语句中的 p[‘name’] = ‘jack‘
修改为 p[‘age’] = 20
,就需要把 self.name = value
中的 name 改为 age,此时的 key 就是 age,value 的值为 20。
一般不会选择写死,只能用变量来做,先把对象转换为字典,然后字典里再写值。
代码即为p.__dict__[key] = value
整理代码内容:
class Person(object):
def __init__(self,name,age,city):
self.name = name
self.age = age
self.city = city
def __setitem__(self,key,value):
p.__dict__[key] = value
p = Preson(‘张三’, 18, ‘襄阳‘)
print(p.__dict__)
p[‘age’] = 20
print(p.name,p.age)
运行结果为:
再加入语句p[‘name’] = ‘tony’
(4)self.key = value
加入之后不会改 p.name 和 p.age,只是加了一个 key 属性
整理代码内容:
p = Preson(‘张三’, 18, ‘襄阳‘)
print(p.__dict__)
p[‘name’] = ‘jack‘
p[‘name’] = ‘tony’
print(p.name,p.age,p.key)
运行后结果:
也就是多了一个属性,self.key=key,而不是改原来的属性
二、通过字典获取值
直接加入语句 print(p[‘name’])
执行,运行的结果默认是有错误的
前面的设置值是 setitem,所以这里的获取值就是 getitem
print(p[‘name’]) 会调用__getitem__方法,然后__getitem__方法返回值
整理代码内容:
class Person(object):
def __init__(self,name,age,city):
p = Preson(‘张三’, 18, ‘襄阳‘)
print(p.__dict__)
p[‘name’] = ‘jack‘
p[‘name’] = ‘tony’
print(p.name,p.age,p.key)
print(p[‘name’])
这个方法就是把对象当作字典一样赋值、取值。
这个一般不用,但是看到别人写的时候要理解,这些都是魔法方法的调用。当使用[] 会自动调用 setitem 方法;当使用取值的时候会自动调用 getitem 方法。
说明如果想实现某种功能是都可以的实现的,但不是说提供的功能都能这么实现,这是没有必要的。
接触过其他语言,不可以做的功能,会发现在 python 语言中都可以完成,python语言是高度拓展的。只要找到合适的方式就都可以完成。