魔法方法:getattr setattr delattr

一、getattr

__getattr__

在访问类内属性的时候如果类包含此属性,不会调用此方法,即直接返回;如果类内没有此属性会自动调用此方法

下面通过一个例子加深理解:这里我们构建了一个类obj,他包含有一个属性name,当我们初始化之后我们想要得到age信息,但是类内没有此信息,于是我们从__getattr__中进行搜索,在里面运行完后__getattr__函数并没有返回值,所以输出为None;然后我们想要得到height信息,类内依旧没有此信息,我们再次进入__getattr__函数,其中匹配到了height,并返回相应的值

注意:我们在输出height之后再次输出了age,此时有值了,为什么呢?这是因为我们第一次进入到getattr函数中时,运行了self.age=22,即将age变为类内属性了,所以第二次输出时就有值了

class obj():
    def __init__(self, value):
        self.name = value

    def __getattr__(self, key):
        print(f"__getattr__{key}")
        self.age = 22
        if key == "height":
            return 178

a = obj("harry")
print(a.name)
print(a.age)
print(a.height)
print(a.age)
'''
harry
__getattr__age
None
__getattr__height
178
22
'''

二、setattr

__setattr__

在设置类内属性的时候会自动调用此方法,即只要在类内出现self.xx=xxx就一定会调用此方法

下面举一个例子,这里我们初始化了一个类,name=“harry”,由于在初始化时出现了self.name=value语句,因此进入到__setattr__函数中,其中赋值方法在代码中给出,其中错误方法为self.name=value,这是因为调用这句话时又会再次调用__setattr__函数,然后又会执行self.name=value进入无限死循环

注意:由于此时类已经有属性name了,所以不会执行__getattr__函数了

class obj():
    def __init__(self, value):
        self.name = value

    def __setattr__(self, name, value):
        print(f"set: {name}--{value}")
        # 第一种赋值方法
        self.__dict__[name] = value
        # 第二种赋值方法
        # object.__setattr__(self, name, value)
        # 错误赋值方法
        # self.name = value

    def __getattr__(self, key):
        print(f"get: {key}")

a = obj("harry")
print(a.name)
a.name = "Potter"
print(a.name)
'''
set: name--harry
harry
set: name--Potter
Potter
'''

三、delattr

__delattr__

删除类内属性的时候会自动调用此方法

有了__getattr____setattr__之后,这个方法就很好理解,直接看下面带吗

class obj():
    def __init__(self, value, height):
        self.name = value
        self.height = height

    def __setattr__(self, name, value):
        print(f"set: {name}--{value}")
        # self.__dict__[name] = value
        object.__setattr__(self, name, value)

    def __getattr__(self, key):
        print(f"get: {key}")

    def __delattr__(self, key):
        print(f"delete: {key}")
        object.__delattr__(self, key)

a = obj("harry", 178)
del(a.name)
print(a.name)

'''
set: name--harry
set: height--178
delete: name
get: name
None
'''
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值