首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在键/值__dict__赋值中调用__getattribute__?Python

在键/值dict赋值中调用getattribute是为了实现对属性赋值的自定义逻辑。在Python中,对象的属性访问和赋值会通过特殊的方法来进行处理,其中getattribute方法用于获取对象的属性值,而setattr方法用于设置对象的属性值。

当我们使用赋值语句给对象的属性赋值时,Python会自动调用setattr方法来完成赋值操作。然而,在一些特定情况下,我们希望对属性赋值时能够执行一些额外的逻辑,例如在赋值之前进行校验、记录赋值操作等。这时就可以通过在类中定义setattr方法来实现自定义逻辑。

在键/值dict赋值中调用getattribute的目的是为了在设置属性值之前,通过调用getattribute方法来获取属性的当前值。这样可以在赋值之前先获取属性值,然后根据需要对其进行处理或者进行一些判断。例如,可以根据当前属性值的特定条件来决定是否允许赋值,或者在赋值之前先记录下属性的旧值。

需要注意的是,在getattribute方法中调用setattr方法会导致递归调用,因此在实现时需要小心处理以避免无限循环。

以下是一个简单的示例,演示了在键/值dict赋值中调用getattribute的用法:

代码语言:txt
复制
class CustomClass:
    def __init__(self):
        self._data = {}
    
    def __getattribute__(self, name):
        if name == '_data':
            return object.__getattribute__(self, name)
        else:
            # 获取属性的当前值
            current_value = object.__getattribute__(self, '_data').get(name)
            # 进行一些处理或判断
            if current_value is not None:
                print(f'Current value of {name}: {current_value}')
            return current_value
    
    def __setattr__(self, name, value):
        if name == '_data':
            object.__setattr__(self, name, value)
        else:
            # 在赋值之前获取属性的当前值
            current_value = object.__getattribute__(self, name)
            # 进行一些处理或判断
            if current_value is not None:
                print(f'Changing value of {name} from {current_value} to {value}')
            # 设置属性值
            object.__getattribute__(self, '_data')[name] = value

# 使用自定义类
obj = CustomClass()
obj.key1 = 'value1'  # 设置属性值
obj.key1 = 'new_value1'  # 修改属性值

在这个示例中,CustomClass类中定义了getattributesetattr方法。在getattribute方法中,通过调用object.getattribute方法获取属性的当前值。在setattr方法中,通过调用object.getattribute方法获取属性的当前值,并且可以在赋值之前进行一些额外的处理。

这只是一个简单的示例,实际应用中可能会根据具体的需求进行更复杂的逻辑处理。在云计算领域中,可能会使用类似的技术来实现对云资源的属性赋值时的自定义逻辑,例如在赋值之前进行资源配额检查、审计操作等。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

定制类和黑魔法

我们代码增加了特殊方法__add__(),它就是实现加法运算符的魔术方法。python,运算符的作用是简化书写,实现运算的运算符都有其对应的特殊方法支撑才得以实现的。...内存只有一个__slots__属性,再增加实例时__slots__属性不会增加。   类属性赋值后,可以通过任何一个实例来调用它,但不能通过任何一个实例修改类属性的。...python的具有属性拦截功能的方法:     __setattr__(self, name, value):如果要给name赋值,就调用这个方法。     ...也可以定义__getattribute__(self, name),并且只要访问属性,不论该属性是否存在,都会自动调用它。...当新增属性并赋值后,属性就存在于__dict__中了,再调用时,依然会被拦截,但由于存在于__dict__中了,会将结果返回。以上黑魔法的参数name就对应于对象或类的属性。

46810

Python对象的属性访问过程详解

补充知识:深入理解python对象及属性 类属性和实例属性 首先来看看类属性和类实例的属性python如何存储,通过__dir__方法来查看对象的属性 class Test(object):...,这就是这个类的属性,其就是类属性的数据....__dict__ {'lang': 'python'} # 实例找不到flower属性,调用类属性 s.flower 'peach' 下面看看类包含方法,__dict__如何发生变化 # 定义类...默认情况下,python各个实例为名为__dict__的字典里存储实例属性,而字典会消耗大量内存(字典要使用底层散列表提升访问速度), 通过__slots__类属性,元组存储实例属性,不用字典,...但是,找 a.lang的时候,不仅实例属性没有,类属性也没有,于是就调用了__getattr__()方法。在上面的类,有这个方法,如果没有__getattr__()方法呢?

2K20
  • Python获取对象属性的几种方式小结

    补充知识:深入理解python对象及属性 类属性和实例属性 首先来看看类属性和类实例的属性python如何存储,通过__dir__方法来查看对象的属性 class Test(object):...,这就是这个类的属性,其就是类属性的数据....__dict__ {'lang': 'python'} # 实例找不到flower属性,调用类属性 s.flower 'peach' 下面看看类包含方法,__dict__如何发生变化 # 定义类...默认情况下,python各个实例为名为__dict__的字典里存储实例属性,而字典会消耗大量内存(字典要使用底层散列表提升访问速度), 通过__slots__类属性,元组存储实例属性,不用字典,...但是,找 a.lang的时候,不仅实例属性没有,类属性也没有,于是就调用了__getattr__()方法。在上面的类,有这个方法,如果没有__getattr__()方法呢?

    3.9K20

    python __setattr__, __getattr__,__getattribute__, __call__使用方法

    如果继承树可以找到该属性,则不调用此方法 实例instance通过instance.name访问属性name,只有当属性name没有实例的__dict__或它构造类的__dict__或基类的__dict...__没有找到,才会调用__getattr__。...如下所示,ClassA定义了__getattribute__方法,实例insA获取属性时,都会调用__getattribute__返回结果,即使是访问__dict__属性。...如果类自定义了__setattr__方法,当通过实例获取属性尝试赋值时,就会调用__setattr__。常规的对实例属性赋值,被赋值的属性和会存入实例属性字典__dict__。...类定义的self.attr也同样,所以__setattr__下还有self.attr的赋值操作就会出现无线递归的调用__setattr__的情况。

    1.3K70

    Python 类与继承

    调用过程,无需将类实例化,可以直接通过 类名.方法名 进行调用,也可以实例化后通过 实例名.方法名 进行调用静态方法内部,只能通过 类名.类变量名 方式访问变量 class A: a...,使用 @classmethod 装饰器进行修饰,同时需要指定传入第一个参数为 cls(命名可以自定义),调用过程,可以直接通过 类名.方法名 进行调用,也可以实例化后通过 实例名.方法名 进行调用...属性作为对应的 A....python 中有许多不需要引用就能直接使用的函数,例如 open 、str、chr 等等,这些函数都包含在内建模块 python2/3 对于内建模块,有不同的表示方法 python2 python2...__dict__ 调用方法也很简单 __builtin__.str(1) python3 python3 ,内建模块用 builtins 表示,同样也要先引入才能查看,各种查看方法与调用方法与 python2

    72340

    Some question about

    __' 问题起源 Python 对于某些 object __dict__ 属性是只读的,比如对于 type object。...简单来说,因为一个实例的 __dict__ 属性不能(why?)保存在实例的 __dict__ ,所以需要通过 class 的一个 descriptor 来调用。...对于一般的实例对象,__dict__ 会返回一个保存包含所有实例属性的独立的 dict 实例对象,对 __getattribute__调用首先会访问这个 dict,并获取相应的实例属性 (这个调用会在通过描述器协议访问...__dict__["__dict__"] ,对于 x.__dict__ 的访问就会用描述器协议实现,x.__dict__ 的就会保存在实例的一个特殊字段里。...这个特殊的 proxy 对象允许你,获取那些定义 class 而不是 class 的基类的的属性。

    67830

    Python object类的特殊方法代码讲解

    python版本:3.8 class object: """ The most base type """ # del obj.xxx或delattr(obj,'xxx')时被调用,删除对象的一个属性...如果属性存在,则返回该属性的,如果属性不存在,则返回None。 注意,我们使用hasattr(obj,属性名)来判断某个属性是否存在时,__getattribute__方法也会被调用。...__setattr__方法 当我们执行obj.name=’alex’或setattr(obj,属性名,属性),即为属性赋值时被调用。...特别注意,类的构造函数对属性进行初始化赋值时也是调用了该方法: class Foo(object): def __init__(self): self.name = 'Alex' # 这里也要调用_...__doc__) # 打印 这是一个类,名叫Foo 到此这篇关于Python object类的特殊方法代码讲解的文章就介绍到这了,更多相关Python object类的特殊方法内容请搜索ZaLou.Cn

    84030

    Python中下划线---完全解读

    __dir__() 如果某个类定义了 __getattribute__() 方法, 每次引用属性或方法名称时 Python调用它(特殊方法名称除外,因为那样将会导致讨厌的无限循环)。...__getattr__('color');而只会返回x.color 已定义好的。 无论何时给属性赋值,都会调用 __setattr__() 方法。...__contains__(x) 序号 目的 所编写代码 Python 实际调用 通过来获取值 x[key] x.... __exit__() 方法调用了 self.close() . ?该 __exit__() 方法将总是被调用,哪怕是 with 语块引发了例外。...__getattr__ 一般的查找属性查找不到之后会调用此函数 __setattr__ 取代一般的赋值操作,如果有此函数会调用此函数, 如想调用正常赋值途径用 object.

    1.6K110

    觉得 Python 太“简单了”,这些题你能答对几个?

    请大佬们解释下,为什么 a() 没有调用出 a....答案 1.第一个问题的其实很简单,如果你再运行一次 print(niche.math) 你就会发现,输出是 120 ,那么这是为什么呢?这就要先从 Python调用机制说起了。...好的,现在回到我们的问题,我们发现,我们的类 Exam,其 self.math 的调用过程是,首先在实例化后的实例的 __dict__ 中进行查找,没有找到,接着往上一级,我们的类 Exam 中进行查找...,那么优先调用实例字典的属性而不触发描述符协议,如果实例字典不存在该属性,那么触发 Non-Data descriptor 的描述符协议。...回到之前的问题,我们即使 __set__ 将具体的属性写入实例字典,但是由于类字典存在着 Data descriptors ,因此,我们调用 math 属性时,依旧会触发描述符协议。

    37240

    Python进阶——什么是描述符?

    Python 开发,你可能听说过「描述符」这个概念,由于我们很少直接使用它,所以大部分开发人员并不了解它的原理。...Ten 定义了一个 __get__ 方法,返回具体的 Python ,允许把一个类属性,托管给一个类,这个属性就是一个「描述符」。 换句话说,「描述符」是一个「绑定行为」的属性。...如果是描述符,再检查它是否是一个数据描述符 如果是数据描述符,则调用数据描述符的 __get__ 如果不是数据描述符,则从 __dict__ 查找 如果 __dict__ 查找不到,再看它是否是一个非数据描述符... __getattribute__ ,它会检查这个类属性是否是一个描述符,如果是一个描述符,那么就会调用它的 __get__ 方法。...首先我们定义一个校验基类 Validator, __set__ 方法调用 validate 方法校验属性是否符合要求,然后再对属性进行赋值

    36330

    Python学习:内建属性、内建函数的教程

    常用内建属性说明触发方式__init__构造初始化函数创建实例后,赋值时使用,__new__后__new__生成实例所需属性创建实例时__class__实例所在的类实例....__dict__)__doc__类文档,子类不继承 help(类或实例)__getattribute__ 属性访问拦截器 访问实例属性时__bases__ 类的所有父类构成元素类名....function函数,返回包含每次function函数返回的list(python3返回迭代器)。...返回的类型和参数sequence的类型相同(python3返回迭代器)。...Python3,reduce函数已经被从全局名字空间里移除了,它现在被放置fucntools模块里用的话要先引入:from functools import reduce示例:# Python学习交流群

    58410

    python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用。__dict____dict__是用来存储对象属性的一个字典,其为属性名,为属性的。...既然__dict__是个字典那么我们就可以用字典的属性了。我们通过使用dir()属性来看看__dict__都有哪些属性。...我们使用给对象的属性赋值的时候:class A(): def __init__(self,dicts): self.name=dicts["name"] self.age...,方便的通过链式调用生成对应的url,碰到get方法的时候调用函数获取其网页源码。...可调用的对象更加的优雅,链式的操作不仅优雅而且还能很好的说明调用的接口的意义。下面展示一个__getattr__经典应用的例子,可以通过获取属性的方式获取字典的键值。

    2.2K30

    Python反射和描述器总结

    反射 Python,能够通过一个对象,找出type、class、attribute或者method的能力,成为反射。...__getattribute__() 实例的所有的属性访问,第一个都会调用__getattribute__方法,它阻止了属性的查找,该方法应该返回或者抛出一个AttributeError异常 它的return...__grtattribute__方法为了避免该方法无限的递归,他的实现应该永远调用基类的同名方法以访问需要的任何属性,例如:object.__getattribute__(self,name)。...描述器: 描述器定义 python,一个类实现了__get__、__set__、__delete__三个方法的任何一个方法,就是描述器。...描述器python应用非常广泛,python的方法(包括staticmethod()和class method())都实现为非数据描述器,因此,实现可以重新定义和覆盖方法。

    92520

    每天一道 python 面试题 - Python反射与自省

    例如,如果你一个类添加了 __slots__属性,那么这个类的实例将不会拥有 __dict__ 属性,但是 dir() 仍然可以找到并列出它的实例所有有效属性 MyNewClass....__class__ 类属性和实例属性:类属性仅是与类相关的数据,这些可以像静态成员那样被引用,即使多次实例化调用类,他们的都保持不变 class T(object): version...方法仅仅是类内部定义的函数,这意味着方法时类属性而不是实例属性 任何方法定义的第一个参数都是变量self,它表示调用此方法的实例对象 非绑定方法:需要调用一个还没有任何实例的类的一个方法 class...'The name is zhang' p = Person('python') #实例化绑定方法,使用实例调用调用的实例被作为第一个参数被隐含的传递过去 print(p) <__main__.Person...__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute

    73410

    零基础学习 Python 之类属性

    先不管为什么,我们继续交互模式下敲下面的代码: >>> A.x 1 A 是刚刚建立的类的名字,x 是类的一个变量,它引用的对象是整数 1。通过 A.x 的方式就能得到整数 1,。...像这样的,类的 x 被称为类的属性,而 1 是这个属性的,A.x 是调用类属性的方式。 我们在这里谈到了 “属性”,请不要忽视这个词,很多的领域都有它的身影。...如果要调用类的某个属性,其方法是用英文的句号,就如我们例子的 A.x。类的属性仅仅与其所定义的类绑定,并且这种属性本质上就是类里的变量。它的不依赖任何的实例,只是由类中所写的变量赋值语句确定。...我在前面的文章说过很多次, Python “万物皆对象”,类当然也不例外,它也是对象,凡是对象都具有属性和方法,而属性是可以增加删除和修改的。...A.y 依然存在,我们可以修改 y 这个类的属性的: >>> A.y = 10000 >>> A.y 10000 y 是我们 A 类自己定义的属性,其实在一个类建立的同时,Python 也让这些类具有了一些默认的属性

    25930
    领券