zoukankan      html  css  js  c++  java
  • 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__(属性找不到报错时执行)
    
    
    如果我失败了,至少我尝试过,不会因为痛失机会而后悔
  • 相关阅读:
    红黑树的插入操作详解
    Java实现红黑树
    No-sql之redis常用命令
    如何配置JedisPool的参数
    JedisPool使用注意事项
    2-SAT问题的小结
    BZOJ 2142 礼物 组合数学 CRT 中国剩余定理
    BZOJ 4521 CQOI 2016 手机号码 数位DP
    BZOJ 4380 Myjnie 区间DP
    BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组
  • 原文地址:https://www.cnblogs.com/tangcode/p/11375965.html
Copyright © 2011-2022 走看看