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

  • 相关阅读:
    带轮播图、导航栏、商品的简单html,以及轮播图下边数字随轮播图的改变而改变
    设计table表格,用js设计偶数行和奇数行显示不同的颜色
    用js实现九九乘法口诀两种方式
    [FW]修复ubutnu12.04+win7的grub2引导
    How to compile Linux kernel in fedora 6
    [Fw]初探linux中断系统(2)
    [Fw]初探linux中断系统(1)
    Regular Expression 範例
    [fw]IDT表的初始化
    [Fw]中断的初始化
  • 原文地址:https://www.cnblogs.com/jayafs/p/6196956.html
Copyright © 2011-2022 走看看