• 类的内置方法(魔法方法)


    类的内置方法(魔法方法)

    凡是在类内部定义,以__ 开头__ 结尾的方法都是类的的内置方法,也称为魔法方法

    类的内置方法,会在某种条件满足下自动触发

    1、__ init__

    在调用类时自动触发

    2、__ new__

    在 __ init __ 触发前自动触发,调用该类是,内部会通过__ new __ 产生一个新的对象

    class Demo:
        # 在__init__触发前自动触发
        def __new__(cls, *args, **kwargs):
            print('__new__执行')
            # 内部会通过object产生一个新对象返回来触发__init__,如果此处未返回新对象,则不会触发__init__
            return object.__new__(cls, *args, **kwargs)
    
        def __init__(self):
            print('__init__执行')
    
    obj = Demo()
    # __new__执行
    # __init__执行 

    3、__ getattr__

    在通过 “ 对象 . 属性 ” 获取对象属性时,若没有该属性时触发

    class Demo:
        # 在通过 “ 对象.属性 ” 获取对象属性时,若没有该属性时触发
        def __getattr__(self, item):
            print('__getattr__执行')
            print(item)
            # 没有时默认返回None,可以设置默认返回值
            return '设置的默认返回值'
    
    obj = Demo()
    print(obj.x)
    # __getattr__执行
    # x
    # 设置的默认返回值
    

      

    4、__ getattribute__

    在通过 “ 对象.属性 ” 获取对象属性时,不管没有该属性,都会触发

    注意:当 __ getattr __ 和 __ getattribute __ 同时存在在类内部时,只会触发 __ getattribute __

    class Demo:
        def __getattribute__(self, item):
            print('__getattribute__执行')
            print(item)
            # 不管有没有都是默认返回None,可以设置默认返回值
            return '设置的默认返回值'
    
            # 此处无法获取查找的属性值,不能通过对象.属性来查找属性值否则会造成递归导致程序崩溃
            # return self.__dict__[item]
            # return getattr(self, item)
    
    obj = Demo()
    obj.x = 10
    print(obj.x) 
    # __getattribute__执行
    # x
    # 设置的默认返回值

    5、__ setattr __

    当使用 “ 对象 . 属性 = 属性值” 时,添加或修改属性值时触发

    class Demo:
            # 当使用 对象. 属性 = 属性值 时触发
        def __setattr__(self, key, value):
            print('__setattr__执行')
            print(key,value)
            #需要将添加或修改的属性加到对象名称空间中
            self.__dict__[key] = value
    
    obj = Demo()
    print(obj.__dict__)  # {}
    obj.x = 10  # __setattr__执行/ x 10
    print(obj.__dict__)  # {'x': 10}  

    6、__ call__

    在调用对象,“ 对象()”时触发

    class Demo:
        # 使用对象()调用对象时触发
        def __call__(self, *args, **kwargs):
            print('__call__执行')
            # 默认返回None,可以设置默认返回值
            return '设置默认值'
    
    obj = Demo()
    print(obj())
    # __call__执行
    # 设置默认值

    7、__ str__

    在打印对象时触发,必要要有一个 “ 字符串 ” 返回值

    class Demo:
        def __str__(self):
            print('__str__执行')
            # 必须要有一个字符串返回值
            return '字符串'
    
    obj = Demo()
    print(obj)
    # __str__执行
    # 字符串 

    8、__ getitem__

    在通过“ 对象[key]” 来获取属性值时触发

    class Demo:
        def __getitem__(self, item):
            print('__getitem__执行')
            print(item)
            # 查找到value的值并返回,没有会报错,不写此步不管有没有都会返回None
            return self.__dict__[item]
    
    obj = Demo()
    obj.x = 10
    print(obj['x'])
    # __getitem__执行
    # x
    # 10  

    9、__ setitem__

    在通过 “ 对象[key] = value ”设置属性时触发

    class Demo:
        def __setitem__(self, key, value):
            print('__setitem__方法执行')
            print(key, value)
            # 需要将添加或修改的属性加到对象名称空间中
            self.__dict__[key] = value
    
    obj = Demo()
    print(obj.__dict__)  #{}
    obj['x'] = 10
    # __getitem__执行
    # x 10
    print(obj.__dict__) # {'x': 10}
    

      

     

     

  • 相关阅读:
    Rhino 是一个完全使用Java语言编写的开源JavaScript实现。Rhino通常用于在Java程序中,为最终用户提供脚本化能力。它被作为J2SE 6上的默认Java脚本化引擎。
    VS的快捷键F12改成和ECLIPSE一样用ctrl+点击下载线
    到底要不要拆分函数
    “DllRegisterServer的调用失败”问题解决办法(转)
    select into的缺点
    win8 下脚本安装IIS
    快速打开IIS的方法
    windows下硬盘的逻辑结构
    sql server 2005/2008R2 报“红叉”错,即“不允许所请求的注册表访问权”的错误
    rundll32.exe的相关使用语句
  • 原文地址:https://www.cnblogs.com/lvguchujiu/p/11959946.html
走看看 - 开发者的网上家园