• 【Python】python中的__dict__,__getattr__,__setattr__


    Python class 通过内置成员__dict__ 存储成员信息(字典)

    首先用一个简单的例子看一下__dict__ 的用法

    class A():
        def __init__(self,ax,bx):
            self.a = ax
            self.b = bx
        def f(self):
            print (self.__dict__)
    a = A(1,2)
    a.f()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出结果:{‘b’: 2, ‘a’: 1}

    利用__dict__ 可以达到一些简化代码的目的,参考下面的例子

    
    class Person:
        def __init__(self,_obj):
            self.name = _obj['name']
            self.age = _obj['age']
            self.energy = _obj['energy']
            self.gender = _obj['gender']
            self.email = _obj['email']
            self.phone = _obj['phone']
            self.country = _obj['country']
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    简化成下面的代码

    
    class Person:
        def __init__(self,_obj):
            self.__dict__.update(_obj)
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    我们可以通过重载__getattr__和__setattr__来拦截对成员的访问或者作出一些自己希望的行为 
    __getattr__ 在访问对象访问类中不存在的成员时会自动调用

    class A():
        def __init__(self,ax,bx):
            self.a = ax
            self.b = bx
        def f(self):
            print (self.__dict__)
        def __getattr__(self,name):
            print ("__getattr__")
    a = A(1,2)
    a.f()
    a.x
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出结果

    {'b': 2, 'a': 1}
    __getattr__
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    __setattr__ 方法用于在初始化对象成员的时候调用,即在设置__dict__的item时就会调用__setattr__方法。 具体看下面的例子

    class A():
        def __init__(self,ax,bx):
            self.a = ax
            self.b = bx
        def f(self):
            print (self.__dict__)
        def __getattr__(self,name):
            print ("__getattr__")
        def __setattr__(self,name,value):
            print ("__setattr__")
            self.__dict__[name] = value
    
    
    
    a = A(1,2)
    a.f()
    a.x
    a.x = 3
    a.f()
    

    输出结果

    __setattr__
    __setattr__
    {'a': 1, 'b': 2}
    __getattr__
    __setattr__
    {'a': 1, 'x': 3, 'b': 2}
  • 相关阅读:
    python epoll
    解决linux下/etc/rc.local开机器不执行的原因
    xen4.1.2网桥配置
    用户激励设计[转]
    C#4.0的dynamic和var及object关键字辨析
    动态设置和修改Membership/Profile/RoleProvider的ConnectionString数据库连接字符串
    UseCase用例怎么画_UML用例UseCase的几个理解误区
    C#的delegate/event/Action/Func/Predicate关键字
    我为什么鄙视提倡加班的公司
    [转]个人成长之通关路!
  • 原文地址:https://www.cnblogs.com/paranoia/p/6144912.html
Copyright © 2020-2023  润新知