python中使用_setattr_()需要注册属性吗?

547次阅读
没有评论
python中使用_setattr_()需要注册属性吗?

python中使用_setattr_()需要注册属性吗?

在一般在学习新模块的时候,掌握属性就能对事物的功能有一个大致的了解,就如__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)
<ipython-input-21-6158d7aaef71> in <module>()
      8         pass
      9 not_fun = NotFun()
---> 10 print(not_fun.name)
 
AttributeError: 'NotFun' object has no attribute 'name'

所以,重载__setattr__时必须要考虑是否在__dict__中进行属性注册。

在__setattr__属性在这方面,我们赋值的一定是类属性,而且就测试结果来看。如果不注册属性,最后的代码运行就会出错,这点是我们使用__setattr__时需要注意的。

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:wuyou2021-05-16发表,共计1416字。
新手QQ群:570568346,欢迎进群讨论 Python51学习