控制属性访问的魔术方法

  • __ getattr__(self, item)的使用场景
    访问一个对象属性的时候,如果属性不存在,就会去执行__getattr__()方法,如果属性存在,就不会调用__getattr__()方法
import logging

class Person(object):
    def __init__(self, name):
        self.name = name


    def __getattr__(self, item):
        if item == "oldname":
            logging.warning("oldname在下一个版本中将被废弃,请使用name。")
            return self.name
        else:
            raise AttributeError(item + "属性不存在")
p1 = Person("Deng")

print(p1.name) # Deng 这个值来自__init__()方法
print(p1.oldname)  # Deng   这个值来自__getattr__()方法
# WARNING:root:oldname在下一个版本中将被废弃,请使用name。
  • __setattr__(self, key, value)魔术方法的使用场景:
    如果当前属性不存在就创建当前属性并赋值,如果存在就会修改当前变量的值
    不能在方法内部使用 self.XXX = XXX的赋值形式,会产生递归调用
    应该使用__dict__这个魔术属性。
class Person(object):
    def __init__(self, name):
        self.name = name
        is_adult = False

    def __setattr__(self, key, value):
        """
        :param key: 类属性名称
        :param value: 类属性的值
        :return: None
        如果当前属性不存在就给当前属性赋值
        不能在这里使用 self.XXX = XXX的赋值形式,会产生递归调用
        应该使用__dict__这个魔术属性。
        """
        if key == "age":
            self.__dict__["age"] = value
            self.__dict__["is_adult"] = True if value >= 18 else False

        else:
            self.__dict__[key] = value
p1 = Person("Deng")
p1.age = 18
print(p1.is_adult) # True
p1.gender = 1
print(p1.__dict__)
# {'name': 'Deng', 'age': 18, 'is_adult': True, 'gender': 1}
  • __getattr__(self, item)的使用场景:
    访问一个对象属性的时候,不论属性存在与否,都会去执行__getattribute__方法.所以,相对于__getattr__方法,会先执行__getattribute__方法。
    查了半天视频和文字资料,没有一个将这两个方法分别的适用场景说清楚的。所以,暂时放着不去管吧。
import logging

class Person(object):
    def __init__(self, name):
        self.name = name

    def __getattr__(self, item):
        if item == "oldname":
            logging.warning("oldname在下一个版本中将被废弃,请使用name。")
            return self.name
        else:
            raise AttributeError(item + "属性不存在")

    def __getattribute__(self, item):
        return super(Person, self).__getattribute__(item)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值