zoukankan      html  css  js  c++  java
  • python中__getattr__和__setattr__

    代码:

    #!/usr/bin/env python
    #! -*- coding:utf-8 -*-
    
    
    class A(object):
    
        def __setattr__(self, key, value):
            self.__dict__[key] = value
    
        def __getattr__(self, name):
            return "xxx"
    
    obj = A()

    执行操作的代码:

    代码1:

    print(obj.__dict__)

    结果:

    {} # 空字典

    代码2:

    print(obj.name)

    结果:

    xxx

    代码3:

    obj.name = 'BBB'
    print(obj.__dict__)
    print(obj.name)
    print(obj.xxx)

    结果:

    {'name': 'BBB'}
    BBB
    xxx

    总结:

    1、当我们第一次获取obj.__dict__的结果是为空的字典。

    2、当我们获取对象的某个属性的时候,会先在整个类中找,如过没有则去__getattr__方法里面找,并返回__getattr__中的属性。

    3、当我们操作代码obj.name=’BBB’后,此时在类中会自动调用__setattr__方法;所以此时我们再打印obj.__dict__的时候结果会出现我们设置的属性名和属性对应的值组成的字典。

    为总结的第二点再次举例说明:

    当类中有我们要获取的属性的时候

    class A(object):
        name = "123"
    
        def __setattr__(self, key, value):
            self.__dict__[key] = value
    
        def __getattr__(self, name):
            return "xxx"
    
    obj = A()
    print(obj.__dict__)
    print(obj.name)

    结果:

    {}
    123

    说明:

    此时我们在类中定义了name属性,当我们通过对象获取类中的某个属性的时候,会先在整个类中找,如果有则返回对应的属性,没有则去__getattr__中找并返回的对应属性

    当类中没有我们要的属性:

    class A(object):
    
        def __setattr__(self, key, value):
            self.__dict__[key] = value
    
        def __getattr__(self, name):
            return "xxx"
    
    obj = A()
    print(obj.__dict__)
    print(obj.name)

    结果:

    {}
    xxx

    验证当类中没有对应的属性的时候,会去__getattr__方法中找:

    class A(object):
    
        def __setattr__(self, key, value):
            self.__dict__[key] = value
    
        def __getattr__(self, name):
            name = "123"
            return name
    
    obj = A()
    print(obj.__dict__)
    print(obj.name)

    结果:

    {}
    123

    问题:如果要获取的属性这个类中都没,而且__getattr__返回的是一个变量名,那结果会是怎样的?

    class A(object):
    
        def __setattr__(self, key, value):
            self.__dict__[key] = value
    
        def __getattr__(self, name):
            return name
    
    obj = A()
    print(obj.name)

    结果:

    name

    问题:__getattr__方法中 return 指定的值时,我们获取类中没有的属性,结果怎样?

    class A(object):
    
        def __setattr__(self, key, value):
            self.__dict__[key] = value
    
        def __getattr__(self, name):
            return "ddd"
    
    obj = A()
    print(obj.rrr)

    结果:

    ddd

    对总结第三点再次说明:

    当对类中设置和修改属性的时候,类中会自动调用__setattr__方法。

  • 相关阅读:
    矩阵特征值和椭圆长短轴的关系?
    Harris角点检测原理详解
    SIFT特征提取分析
    Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔
    图像处理与计算机视觉的经典书籍
    霍夫变换
    熔断原理与实现Golang版
    如何利用go-zero在Go中快速实现JWT认证
    如何让服务在流量暴增的情况下保持稳定输出
    企业级RPC框架zRPC
  • 原文地址:https://www.cnblogs.com/jayafs/p/6196956.html
Copyright © 2011-2022 走看看