zoukankan      html  css  js  c++  java
  • 类的内置方法__attr__介绍

    1、hasattr  getaddr  setaddr delattr 这四个函数同样也适用于类

    class BlackMedium:
        feture="Ugly"
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
        def sell_house(self):
            print("%s 正在卖房子,傻逼才买呢" %self.name)
        def rent_house(self):
            print("%s 正在租房子,傻逼才租呢" % self.name)
    print(hasattr(BlackMedium,"feture"))
    
    C:python35python3.exe D:/pyproject/day26/反射.py
    
    True

    2、双下划线开头的attr方法(__开头的都是内置的方法)

    __getattr__

    class Foo:
        x=1
        def __init__(self,y):
            self.y=y
        def __getattr__(self, item):
            print("执行__getattr__")
    f1=Foo(10)
    print(f1.y)
    f1.ssss#当实例调用的方法不存在时候才会执行__getattr
    
    C:python35python3.exe D:/pyproject/day26/双下划线开头的attr方法.py
    
    10
    
    执行__getattr__

    __delattr__

    class Foo:
        x=1
        def __init__(self,y):
            self.y=y
        def __delattr__(self, item):
            print("删除操作---->")
    f1=Foo(10)
    del f1.y#删除实例中的y 会触发__delattr__
    del f1.x #删除类中的x 会触发__delattr__
    
    C:python35python3.exe D:/pyproject/day26/双下划线开头的attr方法.py
    
    删除操作---->
    
    删除操作---->

    __setattr__只要设置一次值,就会触发一次它

    class Foo:
        x=1
        def __init__(self,y):
            self.y=y
        def __setattr__(self, key, value):
            print("__setattr__执行")
            self.__dict__[key]=value
    f1=Foo(10)
    print(f1.__dict__)
    f1.z=2
    print(f1.__dict__)
    
    C:python35python3.exe D:/pyproject/day26/双下划线开头的attr方法.py
    
    __setattr__执行
    
    {'y': 10}
    
    __setattr__执行
    
    {'y': 10, 'z': 2}

    3、如果调用的属性不存在,我们自己又没有定义__getattr的话,就会调用系统默认的

    class Foo:
        pass
    f1=Foo()
    print(f1.xxx)#只有在属性不存在的时候,会自动触发__getattr__
    
    AttributeError: 'Foo' object has no attribute 'xxx'

    我们自己定义一个__getattr__,就会用我们自己的定义的这个

    class Foo:
        def __getattr__(self, item):
            print("---->")
    f1=Foo()
    print(f1.xxx)#只有在属性不存在的时候,会自动触发__getattr__
    
    C:python35python3.exe D:/pyproject/day26/双下划线开头的attr方法.py
    
    ---->
    
    None

    注意:

    这__getattr__    __setattr__   __delattr__这三个只有实例化之后,实例调用的时候才会触发,跟类没有关系 

  • 相关阅读:
    Linux中profile、bashrc、bash_profile之间的区别和联系
    指针长度长几何
    快速理解网络协议视频总结
    gdb调试关键点记录
    调试经验积累
    定位网页元素
    浮动
    盒子模型
    css3
    css
  • 原文地址:https://www.cnblogs.com/gouguoqilinux/p/9208573.html
Copyright © 2011-2022 走看看