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")

 getitem  settiem  deltiem

如果想对实例进行 obj ["val"]、 del obj ["key"] 、obj ["key "] = "val" 操作,必须定义 getitem  settiem  deltiem 方法。否则只能通过点( . ) 属性名来进行一系列操作

class WPUnit(object):
    def __setitem__(self, key, value):
        self.__dict__[key] = value
    def __getitem__(self, key):
        if key in self.__dict__:
            return self.__dict__[key]
        else:
            r = ""
            self.__setitem__(key, r)
            return None
    def __delitem__(self, key):
        del self.__dict__[key]
a = WPUnit()
a["name"]="xiaoming"
print(a.name)              #xiaoming
print(a["name"])          #xiaoming
print(a.__dict__)          #{'name': 'xiaoming'}
del a["name"]
print(a.__dict__)
原文地址:https://www.cnblogs.com/yanxiaoge/p/10500635.html