python面型对面(2)

 反射

class ClassA:
    name = 'xiaoming'
    def __init__(self):
        self.y = 'y'                        #先执行 __setattr__  在执行__getattribute__
        self.z = "z"
    def __getattribute__(self, item):       #只有点(.)才会触发此方法,a["dd"] 不会触发和getattr一样
        # print(item)
        if item == "y":                     # 每次访问属性之前都先执行此方法,可以自定义属性访问的权限
            pass
        else:
            return super().__getattribute__(item)   #必须加否则报错

    def __getattr__(self, item):
        pass                              #当访问的属性不存在的时候执行此方法注意:obj.__dict__['属性名']不会调用该属性"
    def __delattr__(self, item):
        del self.__dict__[item]
    def __setattr__(self, key, value):    #必须要有__setattr__方法
        self.__dict__[key] = value
a = ClassA()
print(a.name)  #xiaoming
print(a.y)     #None
print(a.z)     #z

# 获取属性的三种方式
# print(obj.name)
# print(a.__dict__["y"])   #a.__dict__会触发__getattribute__ 但是["y"] 不会触发
# getattr(obj,"name")

猜你喜欢

转载自www.cnblogs.com/yanxiaoge/p/10500635.html
今日推荐