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__方法。

  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/jayafs/p/6196956.html
Copyright © 2011-2022 走看看