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

在__slots__中使用__setattr__和__getattr__进行委托,而不会触发无限递归

是一种技术手段,用于在Python中控制属性的访问和赋值行为。下面是对这个问题的完善且全面的答案:

slots是Python中的一个特殊属性,用于限制一个类实例可以拥有的属性。通过在类中定义slots属性,可以明确指定实例可以拥有的属性名称,从而减少内存消耗并提高访问速度。

slots中使用setattrgetattr进行委托是一种常见的技巧,用于在限制了slots的类中实现动态属性的访问和赋值。当我们在一个类中定义了setattrgetattr方法时,当属性被访问或赋值时,Python会自动调用这两个方法来处理。

setattr方法在属性被赋值时被调用,可以用于控制属性的赋值行为。在使用setattr进行委托时,我们可以在方法中使用super().setattr(name, value)来调用父类的setattr方法,从而避免无限递归。

getattr方法在属性被访问但不存在时被调用,可以用于控制属性的访问行为。在使用getattr进行委托时,我们可以在方法中使用super().getattr(name)来调用父类的getattr方法,从而避免无限递归。

使用setattrgetattr进行委托的优势是可以在限制了slots的类中实现动态属性的访问和赋值,同时避免无限递归的问题。

这种技术在以下场景中可能会有用:

  1. 当我们需要在限制了slots的类中实现动态属性的访问和赋值时。
  2. 当我们希望对属性的赋值行为进行自定义处理时。

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

注意:本答案没有提及亚马逊AWS、Azure、阿里云、华为云、天翼云、GoDaddy、Namecheap、Google等流行的云计算品牌商,仅提供了对问题的完善和全面的答案。

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

相关·内容

定制类黑魔法

2.引子:使用点来访问属性本质上就是访问类或者对象的__dict__属性字典(类的字典是共享的,每个实例的是独立的)的内容。     ...__setattr__,导致无限递归。   ...需要注意的是,__setattr__会在给属性赋值时自动触发,所以自定义的__setattr__方法不能出现类似于self.key = value的形式的直接赋值操作,这样会陷入无限递归,应使用self...同样的还有__delattr__,删除属性时会自动触发,因此自定义的__delattr__方法,不能出现类似于del self.key形式的直接删除,这样也会陷入无限递归,要用self....__setattr____delattr__的定义属于多此一举,不定义这两种方法也是默认执行赋值或删除操作,因此很少使用。__getattr__用的较多。

46710

Python面向对象魔法方法单例模块代码实例

__dict__[属性]不会触发__getattr__,会报keyerror; __getattribute__:会在对象.属性时触发,不管有没有该属性都会触发; __setattr__: 会在 “对象...# 会一直触发__setattr__,出现递归调用 self.__dict__['a'] = '在对象名称空间增加一个值!'..._属性字典(类的字典是共享的,每个实例的是独立的) 3.为何使用__slots__:字典会占用大量内存,如果你有一个属性很少的类,但是有很多实例,为了节省内存可以使用__slots__取代 实例的_...实例通过一个很小的固定大小的数组来构建,不是为每个实例定义一个字典,这跟元组或列表很类似。__slots__列出的属性名在内部被映射到这个数组的指定小标上。...with语句的目的就是把代码块放入with执行,with结束后,自动完成清理工作,无须手动干预 2.需要管理一些资源比如文件,网络连接锁的编程环境,可以__exit__定制自动释放资源的机制

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

    补充知识:深入理解python对象及属性 类属性实例属性 首先来看看类属性类实例的属性python如何存储,通过__dir__方法来查看对象的属性 class Test(object):...默认情况下,python各个实例为名为__dict__的字典里存储实例属性,字典会消耗大量内存(字典要使用底层散列表提升访问速度), 通过__slots__类属性,元组存储实例属性,不用字典,...,__slots__可以显著节省内存,按需要注意一下问题 定义__slots__之后,实例不能再有__slots__所列名称之外的其他属性 每个子类都要定义__slots__熟悉,因为解释器会忽略继承...__dict__,只要访问这个属性,就要调用`getattribute``,这样就导致了无限递归 # 访问不存在的成员,可以看到,已经被__getattribute__拦截了,虽然最后还是要报错的。...但是,找 a.lang的时候,不仅实例属性没有,类属性也没有,于是就调用了__getattr__()方法。在上面的类,有这个方法,如果没有__getattr__()方法呢?

    2K20

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

    补充知识:深入理解python对象及属性 类属性实例属性 首先来看看类属性类实例的属性python如何存储,通过__dir__方法来查看对象的属性 class Test(object):...默认情况下,python各个实例为名为__dict__的字典里存储实例属性,字典会消耗大量内存(字典要使用底层散列表提升访问速度), 通过__slots__类属性,元组存储实例属性,不用字典,...,__slots__可以显著节省内存,按需要注意一下问题 定义__slots__之后,实例不能再有__slots__所列名称之外的其他属性 每个子类都要定义__slots__熟悉,因为解释器会忽略继承...__dict__,只要访问这个属性,就要调用`getattribute``,这样就导致了无限递归 # 访问不存在的成员,可以看到,已经被__getattribute__拦截了,虽然最后还是要报错的。...但是,找 a.lang的时候,不仅实例属性没有,类属性也没有,于是就调用了__getattr__()方法。在上面的类,有这个方法,如果没有__getattr__()方法呢?

    3.9K20

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

    当对未定义的属性名称实例进行点号运算时,就会用属性名作为字符串调用这个方法。...当属性name可以通过正常机制追溯到时,__getattr__不会被调用的。如果在__getattr__(self, attr)存在通过self.attr访问属性,会出现无限递归错误。...当在__setattr__方法内对属性进行赋值时,不可使用self.attr = value,因为他会再次调用self....如果类自定义了__setattr__方法,当通过实例获取属性尝试赋值时,就会调用__setattr__。常规的对实例属性赋值,被赋值的属性值会存入实例属性字典__dict__。...类定义的self.attr也同样,所以__setattr__下还有self.attr的赋值操作就会出现无线递归的调用__setattr__的情况。

    1.3K70

    Python魔术方法专题

    _del_ 类的析构方法,它在对象被回收时执行,主要的作用时用来释放资源(内存 文件 进程等) 因为Python内存回收机制,使得Python的del方法的执行时间是不确定的,因此不推荐Python中使用析构方法...形式:一个元组或 列表 需要注意 一旦类指定了 slots 那就意味着 类的属性键值绑定关系 由__slots__来维护 也就是说 对象将没有 __dict__方法 __slots__只能约束本类,不能约束继承它的子类..._class_ _class_ 允许通过对象调用类的方法操作类的属性即 object...._getattribute_ 此方法每次访问对象的属性之前都会被调用,它容易使你陷入无限递归中。...也就是说如果属性__getattribute__中找到是不会执行这个方法的。 这个方法也容易陷入无限递归当中。

    57510

    Python面向对象编程Day 26部分

    五大数据类型:整型、字符串、列表、元组、字典 多态 多态概念指出了对象如何通过他们共同的属性动作来操作和访问,不需考虑他们具体的类、多态表明了动态(又名:运行时)绑定的存在,允许重载及运行时类型确定验证...python会给双下划线开头的变量重命名(前加上'_ClassName')   第一个层面的封装:类就是麻袋,这本身就是一种封装   第二个层面的封装:类定义私有的,只类的内部使用,外部无法访问(停留在约定层面...__getattr__函数(最重要,用的比较多)   删除一个对象的属性时会触发__delattr__函数   __setattr__(self,key,value)设置时触发  函数内self.key...=value这样会触发无限递归  应该这样设置self....__dict__[key]=value操作底层字典(del 什么.什么也会导致无限递归)  最后执行设属性操作可通过 f=函数名(参数)  f.key=value这样设定   print(函数名.

    42730

    面向对象-魔术方法

    一、魔术方法 概念 python,所有以__xxx__格式的方法统称为“魔术方法” 方法 初始化 __new__ __init__ __del__ 属性控制 __getattr...容器相关 __len__ __iter__ __contains__ 描述对象 __get__ __set__ __delete__ 可执行 __call__ 槽 __slots...当对未定义的属性名称实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法 __setattr__ 会拦截所有属性的的赋值语句。...这个需要注意,当在__setattr__方法内对属性进行赋值时,不可使用self.attr = value,因为他会再次调用self....__setattr__("attr", value),则会形成无穷递归循环,最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.

    26030

    python 魔术方法(一) 自定义容器类与类属性控制

    特殊方法是 Python 解释器自动调用的,因此你无需自己处理,但是,需要注意的是,这些特殊方法是如此强大,同时也存在着很多的陷阱,使用必须处处小心谨慎。 3. 自定义容器类 3.1....__getattr__ 这个方法只有在用户访问的类属性不存在时才会被调用,通常,你可以实现的 __getattr__ 做兜底操作或抛出异常,也可以结合 __setattr__ 方法实现对某个属性的彻底控制...,只要在类外为不存在的属性赋值,改属性就会被创建, __getattr__ 只有属性不存在的情况下才会被调用,此时,如果你需要定义独特的某个属性的行为,或彻底隐藏某个属性,就必须实现 __setattr...因为 __init__ 方法,对 values 成员初始化的行为让解释器自动去调用了 __setattr__ 方法,而在 __setattr__ 方法,values 成员尚未被创建,因此抛出了异常...__ 一样,__delattr__ 方法的实现也必须格外注意无限递归的产生。

    61420

    Python5对必知的魔法方法

    下划线方法命名的另一用途就是定义“魔法方法”,也称为“特殊方法”。具体地说,我们方法的名称前后分别使用了两个下划线——类似于__func__。...此方法用于对实例对象进行初始化。具体地说,__init__方法,你需要为创建的实例对象设置初始属性。...Python,我们不需要对每个属性使用这些访问控制技术。但是,我们可以通过实现__getattr__ __setattr__方法来实现某种控制。...要正确使用它,你必须借助super()来使用超类方法。否则,它将陷入无限递归。...同样,你应该使用super()来实现__getattribute__方法,以避免无限递归的错误。 结论 本文中,回顾了五对重要的特殊方法。通过这些方法,我们了解了与之相关的五个Python概念。

    55220

    Python 的魔术方法

    构造与初始化 __new__(self): 创建并返回一个类的实例,__init__只是将传入的参数来初始化该实例,一般不需要重载__new__方法除非希望控制类的创建。...__getattr__(self, name): 该方法定义了你试图访问一个不存在的属性时的行为。因此,重载该方法可以实现捕获错误拼写然后进行重定向, 或者对一些废弃的属性进行警告。...也可用于访问私有属性 __setattr__(self, name, value): 是实现封装的解决方案,它定义了你对属性进行赋值修改操作时的行为。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。有一点需要注意,实现__setattr__时要避免”无限递归”的错误。...def __setattr__(self, name, value): self.name = value # 每一次属性赋值时, __setattr__都会被调用,因此不断调用自身导致无限递归

    68620

    流畅的 Python 第二版(GPT 重译)(六)

    因为使用 __slots__ 会产生副作用,所以只有处理非常大量的实例时才是有意义的——考虑的是百万级的实例,不仅仅是千个。许多这种情况下,使用 pandas 可能是最佳选择。...实现__getattr__并不难,但在这种情况下还不够。考虑示例 12-9 的奇怪交互。 示例 12-9。不当行为:对v.x赋值不会引发错误,但会引入不一致性。...警告 知道类级别声明__slots__可以防止设置新的实例属性,很容易就会想要使用这个特性,不是像我们之前那样实现__setattr__。...② zip生成一个由每个可迭代参数的项目组成的元组生成器。如果您对zip不熟悉,请参阅“了不起的 zip”。,需要进行len比较,因为zip在其中一个输入耗尽时会停止生成值没有警告。...新名称具有双重作用:支持case子句中的位置模式,并保存__getattr____setattr__特殊逻辑支持的动态属性的名称。 ⁴ sum、anyall涵盖了reduce的最常见用法。

    14810

    Python Magic Method 与 Setup 方法:深入解析与应用

    __new__ 创建一个实例的过程必定会被调用,但 __init__ 就不一定,比如通过 pickle.load 的方式反序列化一个实例时就不会调用 __init__。...__setattr__(self, name, value) 是实现封装的解决方案,它定义了你对属性进行赋值修改操作时的行为。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。但要注意实现 __setattr__ 时要避免 “无限递归” 的错误,正确的写法应该是 self....__delattr__(self, name) 与 __setattr__ 很像,只是它定义的是你删除属性时的行为。实现 __delattr__ 是同时要避免 “无限递归” 的错误。...总之,setup 方法 Python 软件包的构建和安装起着重要的作用,通过合理使用其各种参数安装方式,可以方便地管理分发 Python 代码。

    7810

    Python反射描述器总结

    反射 Python,能够通过一个对象,找出type、class、attribute或者method的能力,成为反射。...__grtattribute__方法为了避免该方法无限递归,他的实现应该永远调用基类的同名方法以访问需要的任何属性,例如:object.__getattribute__(self,name)。...一般不使用该方法 魔术方法 __getattr__() 当通过搜索实例、实例的类及祖先类查不到属性,就会调用此方法 __setattr__() 通过.访问实例的属性,进行增加,修改都要调用它 __delattr...描述器: 描述器定义 python,一个类实现了__get__、__set__、__delete__三个方法的任何一个方法,就是描述器。...描述器python应用非常广泛,python的方法(包括staticmethod()class method())都实现为非数据描述器,因此,实现可以重新定义覆盖方法。

    92520

    Python魔术方法-Magic Method

    无论属性是否存在,它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__时要避免"无限递归"的错误。...__delattr__: 与 __setattr__ 相同,但是功能是删除一个属性不是设置他们。实现时也要防止无限递归现象发生。...因此,支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免"无限递归"的错误。...进行属性访问控制定义的时候很可能会很容易引起“无限递归”。...copy.deepcopy()返回了你的对象的一个深拷贝——对象其数据都被拷贝了。memodict是对之前被拷贝的对象的一个缓存——这优化了拷贝过程并且阻止了对递归数据结构拷贝时的无限递归

    85560

    Python自学成才之路 魔术方法之属性访问控制

    属性访问魔术方法 __getattr__(self, item) __getattribute__(self, item) 其中__getattr__只有属性不存在时会被调用,__getattribute...__ raise AttributeError(item + "属性不存在") AttributeError: age属性不存在 案例__setattr__方法控制添加属性给属性赋值的过程,...使用这些访问控制魔术方法需要注意一点,不能通过self.xxx(备注:这里指的是访问控制魔术方法)的方式来访问,这样可能会导致死循环。...通过supr(Person, self)来调用_XXX_(备注:这里指访问控制魔术方法)可以避免递归调用。 也有人通过self....__dict__都会触发__getattribute____getattr__方法,这完全没必要,如果在这两个方法里面存在日志,会输出大量没必要的日志。

    53620
    领券