Python对象的属性像字典一样地被修改

参考链接: Python官方文档:模块
参考链接: Python官方文档:object.dict
参考链接: Python官方文档:object.str(self)
参考链接: Python官方文档:object.getitem(self, key)
参考链接: Python官方文档:object.setitem(self, key, value)

主要使用了魔法方法:
	def __str__(self):
	def __getitem__(self,key):
	def __setitem__(self,key,value):


使用了一个特殊属性:
	object.__dict__

官方文档上更详细的说明:

Special Attributes
The implementation adds a few special read-only attributes to several object types, 
where they are relevant. 
Some of these are not reported by the dir() built-in function.
object.__dict__
    A dictionary or other mapping object used to store an object’s (writable) attributes.
特殊属性:
语言实现为部分对象类型添加了一些特殊的只读属性,它们具有各自的作用。 其中一些并不会被 dir() 内置函数所列出。
object.__dict__
    一个字典或其他类型的映射对象,用于存储对象的(可写)属性。
# 参考链接:https://docs.python.org/zh-cn/3.8/library/stdtypes.html#object.__dict__



A special attribute of every module is __dict__. 
This is the dictionary containing the module’s symbol table. 
Modifying this dictionary will actually change the module’s symbol table, 
but direct assignment to the __dict__ attribute is not possible 
(you can write m.__dict__['a'] = 1, 
which defines m.a to be 1, 
but you can’t write m.__dict__ = {}). 
Modifying __dict__ directly is not recommended.
每个模块都有一个特殊属性 __dict__。 
这是包含模块的符号表的字典。 
修改此字典将实际改变模块的符号表,
但是无法直接对 __dict__ 赋值 
(你可以写 m.__dict__['a'] = 1,这会将 m.a 定义为 1,但是你不能写 m.__dict__ = {})。 不建议直接修改 __dict__。
# 参考链接:https://docs.python.org/zh-cn/3.8/library/stdtypes.html#modules

代码:

class Person(object):
    def __init__(self,age,name):
        print("方法:__init__(self,age,name)正在被调用中...")
        self.age = age
        self.name = name
    
    def __str__(self):
        print("方法:__str__(self)正在被调用中...")
        return 'name:{} age:{}'.format(self.name,self.age)
    
    def __getitem__(self,key):
        print('方法:__getitem__(self,key)正在被调用中...')
        return self.__dict__[key]
    
    def __setitem__(self,key,value):
        print('方法:__setitem__(self,key,value)正在被调用中...')
        self.__dict__[key] = value
        
if __name__ == '__main__':
    #pass
    #f()
    p1 = Person(10,'zhangsan')
    print("1111111111111111111111111111111111111111111111")
    print(p1)
    print("2222222222222222222222222222222222222222222222")
    print(type(p1.__dict__))   #p1.__dict__会把这个对象的属性以及值以键值对的形式转化成字典
    print("3333333333333333333333333333333333333333333333")
    p1['name'] = 'tom'        #以字典的形式给属性赋值会调用__setitem__方法
    print("4444444444444444444444444444444444444444444444")
    print(p1.name)
    print("5555555555555555555555555555555555555555555555")
    print(p1['name'])         #以字典的形式获取值会调用__setitem__方法
    print("6666666666666666666666666666666666666666666666")
    str(p1)
    print("7777777777777777777777777777777777777777777777")
    print(type([]))
    print("8888888888888888888888888888888888888888888888")
    print(type(()))
    print("9999999999999999999999999999999999999999999999")
    print(type({}))
    print("0000000000000000000000000000000000000000000000")

控制台输出:

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\chenxuqi\Desktop\新建文件夹>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.9.114305\pythonFiles\lib\python\debugpy\launcher' '54339' '--' 'c:\Users\chenxuqi\Desktop\新建文件夹\test.py'
方法:__init__(self,age,name)正在被调用中...
1111111111111111111111111111111111111111111111
方法:__str__(self)正在被调用中...
name:zhangsan age:10
2222222222222222222222222222222222222222222222
<class 'dict'>
3333333333333333333333333333333333333333333333
方法:__setitem__(self,key,value)正在被调用中...
4444444444444444444444444444444444444444444444
tom
5555555555555555555555555555555555555555555555
方法:__getitem__(self,key)正在被调用中...
tom
6666666666666666666666666666666666666666666666
方法:__str__(self)正在被调用中...
7777777777777777777777777777777777777777777777
<class 'list'>
8888888888888888888888888888888888888888888888
<class 'tuple'>
9999999999999999999999999999999999999999999999
<class 'dict'>
0000000000000000000000000000000000000000000000
PS C:\Users\chenxuqi\Desktop\新建文件夹> 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值