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

在__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__用的较多。

47310
  • 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面向对象编程Day 26部分

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

    43030

    面向对象-魔术方法

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

    26530

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

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

    62720

    Python中5对必知的魔法方法

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

    55620

    Python 中的魔术方法

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

    68920

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

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

    14910

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

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

    8811

    Python中反射和描述器总结

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

    92820

    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__方法,这完全没必要,如果在这两个方法里面存在日志,会输出大量没必要的日志。

    54520

    Python 开发者不得不知的魔术方法(Magic Method)

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

    96270

    python中的内置函数(双下划线) 原

    __contains__(y) 等价于 y in x, 在list,str, dict,set等容器中有这个函数 __base__, __bases__, __mro__, 关于类继承和函数查找路径的...__rmul__(y) == y*x __reduce__, __reduce_ex__ , for pickle __slots__ 使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性...__getattr__ 在一般的查找属性查找不到之后会调用此函数 __setattr__ 取代一般的赋值操作,如果有此函数会调用此函数, 如想调用正常赋值途径用 object....__setattr__(self, name, value) __delattr__ 同__setattr__, 在del obj.name有意义时会调用 参考文档: 1.python:浅析python...中__name__ = '__main__' 的作用:https://www.cnblogs.com/alan-babyblog/p/5147770.html 2.python中那些双下划线开头得函数和变量

    1.6K20

    介绍Python的魔术方法 - Mag

    不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。有一点需要注意,实现__setattr__时要避免"无限递归"的错误,下面的代码示例中会提到。...__delattr__(self, name) __delattr__与__setattr__很像,只是它定义的是你删除属性时的行为。实现__delattr__是同时要避免"无限递归"的错误。...例子说明__setattr__的无限递归错误: def __setattr__(self, name, value): self.name = value # 每一次属性赋值时, __setattr...__都会被调用,因此不断调用自身导致无限递归了。...使用pickling, 你可以将数据存储在文件中,之后又从文件中进行恢复。 下面举例来描述pickle的操作。

    1.2K20

    Python魔术方法-Magic Method

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

    85960
    领券