在一般在学习新模块的时候,掌握属性就能对事物的功能有一个大致的了解,就如__setattr__的使用给属性进行赋值。有没有小伙伴想过赋值的是哪个方面的属性?如果按照我们以往赋值方法,会变成设置函数的 *** 作,而__setattr__是对类属性进行的赋值。下面就python中使用__setattr__()是否注册属性的问题进行探讨。
基本用法:
# setattr(object, name, value) # 此函数与 getattr() 两相对应。 其参数为一个对象、一个字符串和一个任意值。 字符串指定一个现有属性或者新增属性。 函数会将值赋给该属性,只要对象允许这种 *** 作。 例如,setattr(x, 'foobar', 123) 等价于 x.foobar = 123。 # 字符串指定一个现有属性或者新增属性。 函数会将值赋给该属性,只要对象允许这种 *** 作。 class Cat: def __init__(self, name, age): self.name = name self.age = age cat = Cat('Lucy', 3) print(f'{ cat.name = }') print(f'{ cat.age = }') setattr(cat, 'age', 6) print(f'{ cat.age = }') setattr(cat, 'education', 'Harvard University') print(f'{ cat.education = }') cat.education = 'MIT' print(f'{ cat.education = }') # 注意点:要设置实例方法,需要设置类属性,而不是实例属性,设置实例属性会变成普通函数 def intro(self): return f"小猫的名字叫{self.name},今年{self.age}岁。" # setattr(cat, 'intro', intro) setattr(Cat, 'intro', intro) print(f'{ cat.intro = }') print(f'{ cat.intro() = }')
由于__setattr__中并没有将属性注册到__dict__中,所以not_fun对象并没有name属性,因此最后的print(not_fun.name)会报出属性不存在的错误:
AttributeError Traceback (most recent call last)in () 8 pass 9 not_fun = NotFun() ---> 10 print(not_fun.name) AttributeError: 'NotFun' object has no attribute 'name'
所以,重载__setattr__时必须要考虑是否在__dict__中进行属性注册。
在__setattr__属性在这方面,我们赋值的一定是类属性,而且就测试结果来看。如果不注册属性,最后的代码运行就会出错,这点是我们使用__setattr__时需要注意的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)