首页 » 网站推广 » phpself赋值技巧_python中self有哪些赋值办法

phpself赋值技巧_python中self有哪些赋值办法

访客 2024-11-25 0

扫一扫用手机浏览

文章目录 [+]

这周比较忙,趁周末有空更新一篇文章,本文紧张讲解类中实例赋值涉及的几种场景。

方法一;赋值即定义场景:常用办法样例:self.name = laokoo方法二;setattr函数赋值场景:利用字符串的办法操作实例的属性样例: setattr(self,'name','laokoo')方法三;实例字典赋值场景:非标办法,实质上实例便是通过这种办法储存属性的样例:self.__dict__[name] = 'laokoo'方法四;类中实现__setattr__魔术方法场景:=号赋值的办法,setattr函数的赋值实质上都是调用__setattr__魔术方法进行赋值。
__setattr__魔术方法中调用基类的该方法可以实现self属性的赋值 __setattr__魔术方法中利用实例字典赋值的办法可以实现self属性赋值 __setattr__魔术方法中如果利用=号赋值或者setattr函数会引起无限递归样例:详见下方代码方法五;类属性是其余一个类的实例,该类属性也是实例的属性场景:实例访问类属性会触发描述器调用装饰类__get__方法的返回值 实例通过=号赋值会触发描述器调用装饰类的__set__方法进行属性设置样例:详见下方代码方法六,类中实现__slots__属性场景:类中实现该方法后会禁用掉实例的字典,实例的属性全部通过类属性进行储存。
该属性紧张针对实例属性过多,内存资源不敷,实例属性较为大略的场景 __slots__不支持动态添加属性,__slots__不支持类继续建议:可以利用tracemalloc模块测试元组和字典内存空间占用效果样例:详见下方代码备注:方法六中我打印了实例属性"member 'name' of 'Person' objects" 类型是"class 'member_descriptor'"。
小弟实在不太明白__slots__ 后真个实现事理,例如__slots__是用什么数据类型存放数据,member_descriptor 类中不同实例同一个属性是如何存储的。

老例先上汇总解释,后上代码参考。
为了方便大家测试,我将测试区代码封装成了多个小块,大家在测试时根据场景不同区分调用即可。

phpself赋值技巧_python中self有哪些赋值办法

此外本次测试中描述器方法,反射方法,slots方法可能会相互滋扰,以是大家如果有测试需求请测试时关闭掉存在滋扰的选项(存在滋扰的我已经在文中进行相识释),其余大家如果不太明白描述器事理也可以查看我之前整理的一篇关于描述器的解释。

phpself赋值技巧_python中self有哪些赋值办法
(图片来自网络侵删)

class Face: def __get__(self, instance, owner): print('in get ~~~') return self # 装饰类必须实现set魔术方法才能影响功能类的赋值语句 def __set__(self, instance, value): print('in set ~~~~') self.data = value def __repr__(self): return '<face instance>'class Person: face = Face() # #末了测试再开启,slots会禁用掉实例的字典,以是代码中只要利用到实例__dict__的部分都会报错。
测试该功能前请关闭dict利用项 # __slots__ = ['name','age'] def __init__(self, name): print('in init ~~~~') self.name = name # 不雅观察face的值,不雅观察实例的字典 self.face = 'myface' # 第一阶段我们不设置该魔术方法,第二阶段开启该魔术方法 def __setattr__(self, key, value): print('{} {} in setattr ~~~'.format(key, value)) print(self.__dict__) # 测试一,调用基类方法不雅观察效果 super().__setattr__(key, value) # 测试二,直策应用实例字典赋值不雅观察效果 # self.__dict__[key] = value # 测试三,直策应用实例赋值不雅观察效果 # self.key = value # 测试四,利用setattr函数赋值不雅观察效果 # setattr(self,key,value) print(self.__dict__)def test_show(user_input: int): """为了方便不雅观察,我将一个测试场景进行了打印区分""" if user_input == 1: """第一阶段利用办法一进行测试 测试方法:通过=的办法直接赋值 不雅观察结果:name的值,实例的字典""" laokoo = Person('laokoo') print(laokoo.name) laokoo.name = 'kabu' print(laokoo.__dict__) print(laokoo.name) elif user_input == 2: """第一阶段利用办法二进行测试 测试方法:setattr()函数赋值 不雅观察结果:name的值,实例的字典""" laokoo = Person('laokoo') print(laokoo.name) setattr(laokoo, 'name', 'kabu') print(laokoo.__dict__) print(laokoo.name) elif user_input == 3: """第一阶段利用第三种办法测试 测试方法:利用实例字典直接赋值(非标) 不雅观察结果:name的值,实例字典""" laokoo = Person('laokoo') print(laokoo.name) laokoo.__dict__['name'] = 'kabu' print(laokoo.__dict__) print(laokoo.name) elif user_input == 4: """第二阶段利用第四种办法测试,这里的知识点比较多 测试办法:直接赋值,setattr函数赋值,这两种方法在__setattr__中测试 不雅观察结果:name的值,__setattr__方法实行,实例字典""" laokoo = Person('laokoo') """不雅观察实例的初始化逻辑,先调用init,然后遇见赋值语句,直接调用__setattr__魔术方法,然后将key,value传入 由于我们的赋值动作终极实现效果是往实例的字典添加键值对,以是该魔术方法终极也会实行该操作""" print(laokoo.name) elif user_input == 5: """第三阶段利用第五种测试,这里会用到描述器,建议关闭掉功能类的setattr方法,不然显示内容太多 测试方法:直接赋值,setattr函数赋值 不雅观察结果:face的值""" laokoo = Person('laokoo') print(laokoo.face) # 不雅观察data是否由值输出 print(laokoo.face.data) elif user_input == 6: """第四阶段利用第六种测试,这里会用到__slots__ """ laokoo = Person('laokoo') setattr(laokoo,'age',18) # setattr(laokoo,'x','xx') #实例字典会被禁用,会利用类字典储存属性值 # print(laokoo.__dict__) #name字段对应的值是'name': <member 'name' of 'Person' objects>(类型<class 'member_descriptor'>), print(Person.__dict__) #开启__slot__后name才会切换到类属性 # print(type(Person.name))

标签:

相关文章

php反射结构函数技巧_php反射机制用法详解

面向工具编程中工具被授予了自省的能力,而这个自省的过程便是反射。反射,直不雅观理解便是根据到达地找到出发地和来源。比如,一个光秃秃...

网站推广 2024-12-18 阅读0 评论0