python面向对象--反射机制

class Black:
    feture="ugly"

    def __init__(self,name,addr):
        self.addr=addr
        self.name=name


    def sell_house(self):
        print("[%s] 正在卖房子"%self.name)


    def rent_house(self):
        print("[%s]正在租房子,傻逼才租呢?"%self.name)


b1=Black("dream","北京海淀")
print(hasattr(Black,"feture"))
#b1.name--->b1__dict__["name"]
# print(hasattr(b1,"name"))#b1.name
# print(hasattr(b1,"sell_house"))
#
#
# print(getattr(b1,"name"))
# print(getattr(b1,"sell_house"))
#
# func=getattr(b1,"rent_house")#没有报错
# func()
#
#
# print(getattr(b1,"rent_house11","没有这个属性"))



# b1.sb=True
# setattr(b1,"sb",True)
# setattr(b1,"name","alex")
setattr(b1,"func",lambda x:x+1)
setattr(b1,"func1",lambda self:self.name+"sb")
print(b1.__dict__)
print(b1.func)
print(b1.func(1))


print(b1.func1(b1))
# del b1.sb # print(b1.__dict__) # delattr(b1,"sb") # print(b1.__dict__)
1.getattr(object,name)
说明:如果对象object,是不是有name这个属性,如果有获取他的属性,如果没有则报错
2. hasattr(object, name)

说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的)

3. setattr(object, name, value)

这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。

4. delattr(object, name)

与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar

 

 
# class Foo:
#     x=1
#     def __init__(self,y):
#         self.y=y
#
#     def __getattr__(self, item):
#         print("执行__getattr__")
#
#     def __delattr__(self, item):
#         print("删除操作__delattr__")
#
#     def __setattr__(self, key, value):#设定属性
#         print("执行__setattr__")
#         # self.key=value
#         self.__dict__[key]=value


# f1=Foo(10)
#
# print(f1.y)
# print(getattr(f1,"y"))# len(str)--->str.__len__()
#
# f1.ss  #调用一个对象不存在的属性时触发__getattr__
#
#
# del f1.y#删除的时候触发__delattr__属性
# print(f1.x)
#
# f1.x=2#赋值的时候触发__setattr__
# print(f1.__dict__)


# print(dir(Foo))



class Foo:
    def __init__(self,name):
        self.name=name


    def __getattr__(self, item):
        print("你找的属性[%s]不存在"%item)


    def __setattr__(self, key, value):
        print("执行setattr",key,value)

        if type(value) is str:
            print('开始设置')
            # self.key=value#触发__setattr__
            self.__dict__[key]=value

        else:
            print("必须是字符串类型")


    def __delattr__(self, item):
        # print("执行delattr",item)
        print("不允许删除属性[%s]"%item)
        #del self.item
        # self.__dict__.pop(item)


f1=Foo("alex")
f1.age=18#触发__setattr__
#print(f1.__dict__)

# print(f1.name)
# print(f1.age)
# print(f1.gender)

print(f1.__dict__)
del f1.name
print(f1.__dict__)
# print(f1.__dict__)

 

####getattribute的使用
class Foo:
    def __init__(self,y):
        self.y=y

    def __getattr__(self, item):
        print("你找不到的时候执行我")

    def __getattribute__(self, item):
        print("执行的是getattribute")
        #raise AttributeError("抛出异常")



f1=Foo(10)
# f1.y
f1.xx

# f1.xxx#不存在属性访问触发__getattr__
#触发顺序
__getattribute__(最先执行,通过报错上升到,raise xxerror)--->__getattr__(属性找不到报错时执行)

 

posted @ 2019-08-19 11:09  coldplaycode  阅读(219)  评论(0编辑  收藏  举报

coldplaycode