把对象当作字典操作 | 学习笔记

简介: 快速学习把对象当作字典操作

开发者学堂课程【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‘ 

运行结果为:

image.png

(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语言是高度拓展的。只要找到合适的方式就都可以完成。

相关文章
|
5月前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
40 2
|
6月前
2020-10-10 数组和对象的区分方法
2020-10-10 数组和对象的区分方法
|
6月前
|
索引 Python
列表、元组和字典之间的区别是什么
列表、元组和字典之间的区别是什么
75 0
|
6月前
|
存储 索引 Python
怎么理解python中的列表、集合和字典
怎么理解python中的列表、集合和字典
41 0
|
Python
python之集合的创建与使用,遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套
python之集合的创建与使用,遍历,集合常见的操作函数,集合与列表,元组,字典的嵌套
|
存储 Python
Python字典和集合操作指南:创建、获取值、修改和删除键值对,复制和遍历方法全解析
Python字典和集合操作指南:创建、获取值、修改和删除键值对,复制和遍历方法全解析
796 0
|
存储 数据库 索引
【100天精通python】Day8:数据结构_元组Tuple的创建、删除、访问、修改、推导系列操作
【100天精通python】Day8:数据结构_元组Tuple的创建、删除、访问、修改、推导系列操作
145 0
|
存储 索引 Python
12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法
12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法
|
存储 Java 索引
21.从入门到精通:Python数据结构 列表 将列表当做堆栈使用 将列表当作队列使用 列表推导式 嵌套列表解析 del 语句
21.从入门到精通:Python数据结构 列表 将列表当做堆栈使用 将列表当作队列使用 列表推导式 嵌套列表解析 del 语句
逆向操作,把被压平的字典还原成嵌套字典
逆向操作,把被压平的字典还原成嵌套字典
90 0