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

调用Python __getattr__并进入无限递归,即使属性没有丢失

调用Python的__getattr__方法并进入无限递归是指在访问一个对象的属性时,当该属性不存在时会自动调用__getattr__方法。如果在__getattr__方法中再次访问该属性,就会陷入无限递归的循环中。

在Python中,__getattr__是一个特殊的方法,用于在访问一个对象的不存在的属性时进行处理。它接受一个参数,即要访问的属性名,并返回相应的值或引发AttributeError异常。

当调用__getattr__方法时,可以通过检查属性名来判断是否要继续递归。如果属性名与当前对象的某个属性相同,可以返回该属性的值,否则可以选择引发AttributeError异常或返回默认值。

下面是一个示例代码,演示了如何调用__getattr__方法并进入无限递归的情况:

代码语言:txt
复制
class MyClass:
    def __getattr__(self, name):
        return self.name

obj = MyClass()
print(obj.attribute)

在上述示例中,当访问obj.attribute时,由于attribute属性不存在,会自动调用__getattr__方法。在__getattr__方法中,又试图访问self.name属性,但该属性同样不存在,于是会再次触发__getattr__方法,导致无限递归。

为了避免无限递归,我们可以在__getattr__方法中添加条件判断,或者直接返回一个默认值,例如:

代码语言:txt
复制
class MyClass:
    def __init__(self):
        self.name = "default"

    def __getattr__(self, name):
        if name == "name":
            return self.name
        else:
            raise AttributeError(f"'MyClass' object has no attribute '{name}'")

obj = MyClass()
print(obj.attribute)

在上述示例中,当访问obj.attribute时,__getattr__方法会判断属性名是否为name,如果是,则返回self.name属性的值;否则,引发AttributeError异常,提示属性不存在。

关于Python的__getattr__方法的更多信息,可以参考腾讯云的Python开发文档:Python开发文档

请注意,本回答仅针对调用Python的__getattr__方法并进入无限递归的情况进行解答,与云计算、IT互联网领域的其他内容无关。

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

相关·内容

Python中反射和描述器总结

__()方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性。...__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__() __setattr__() 可以拦截对实例属性的增加、修改操作,如果要设置生效...值将作为属性查找的结果 如果抛出AttributeError异常,则会直接调用__gutattr__方法,因为表述属性没有找到。...__grtattribute__方法中为了避免在该方法中无限递归,他的实现应该永远调用基类的同名方法以访问需要的任何属性,例如:object.__getattribute__(self,name)。...一般不使用该方法 魔术方法 __getattr__() 当通过搜索实例、实例的类及祖先类查不到属性,就会调用此方法 __setattr__() 通过.访问实例的属性,进行增加,修改都要调用它 __delattr

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

    __getattr__ 这个方法只有在用户访问的类属性不存在时才会被调用,通常,你可以在实现的 __getattr__ 中做兜底操作或抛出异常,也可以结合 __setattr__ 方法实现对某个属性的彻底控制...,只要在类外为不存在的属性赋值,改属性就会被创建,而 __getattr__ 只有在属性不存在的情况下才会被调用,此时,如果你需要定义独特的某个属性的行为,或彻底隐藏某个属性,就必须实现 __setattr...__setattr__ 方法会在每一次用户为某个属性赋值时被调用,因此要格外防范无限递归的产生: class TechlogTest: def __init__(self): self.values...__ 一样,__delattr__ 方法的实现也必须格外注意无限递归的产生。...,其实是无需实现 __getattribute__ 方法,事实上,去主动实现 __getattribute__ 方法也是不建议的,因为这太容易造成无限递归

    61520

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

    如果类没有定义 __str__ 方法,Python 会试图把调用 __repr__ 的字符串结果返回给用户。...如果类没有定义 __str__ 方法,Python 会试图把调用 __repr__ 的字符串结果返回给用户。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。但要注意实现 __setattr__ 时要避免 “无限递归” 的错误,正确的写法应该是 self....__delattr__(self, name) 与 __setattr__ 很像,只是它定义的是你删除属性时的行为。实现 __delattr__ 是同时要避免 “无限递归” 的错误。...然后,在命令行中进入软件包的根目录,执行以下命令: pip install . 这将根据 setup.py 文件中的配置信息安装软件包及其依赖库。

    7910

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

    无论属性是否存在,它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__时要避免”无限递归”的错误。...__delattr__ 与 __setattr__ 相同,但是功能是删除一个属性而不是设置他们。实现时也要防止无限递归现象发生。...因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免”无限递归”的错误。...在进行属性访问控制定义的时候很可能会很容易引起“无限递归”。...它们反应了关于面向对象程序上一些重要的东西在Python上,并且总的来说Python: 总是一个简单的方法去找某些事情, 即使没有必要的.

    95670

    Python 中的魔术方法

    构造与初始化 __new__(self): 创建返回一个类的实例,而__init__只是将传入的参数来初始化该实例,一般不需要重载__new__方法除非希望控制类的创建。...__init__(self): 可以理解为构造函数,将传入的参数初始化成实例 __del__(self): 可以理解为析构函数 属性访问控制 Python缺少对于类的封装,但人们希望Python能够定义私有属性...Python其实可以通过魔术方法来实现封装。 __getattr__(self, name): 该方法定义了你试图访问一个不存在的属性时的行为。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。有一点需要注意,实现__setattr__时要避免”无限递归”的错误。...def __setattr__(self, name, value): self.name = value # 每一次属性赋值时, __setattr__都会被调用,因此不断调用自身导致无限递归

    68620

    Python魔术方法-Magic Method

    无论属性是否存在,它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__时要避免"无限递归"的错误。...__delattr__: 与 __setattr__ 相同,但是功能是删除一个属性而不是设置他们。实现时也要防止无限递归现象发生。...因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免"无限递归"的错误。...在进行属性访问控制定义的时候很可能会很容易引起“无限递归”。...它们反应了关于面向对象程序上一些重要的东西在Python上,并且总的来说Python: 总是一个简单的方法去找某些事情, 即使没有必要的.

    85560

    Python中getattr、__get__、__getattr__和__getattribute__的区别

    getattr getattr (object, name[, default])是Python的内置函数之一,它的作用是获取对象的属性。...__getattr__(self, name)是一个对象方法,如果找不到对象的属性时会调用这个方法。 这个方法应该返回属性值或者抛出AttributeError异常。...注意,如果通过正常机制能找到对象属性的话,不会调用__getattr__方法。 示例 >>> class Frob: ......如果类还同时定义了__getattr__()方法,则不会调用__getattr__()方法,除非在__getattribute__()方法中显示调用__getattr__()或者抛出了AttributeError...该方法应该返回属性值或者抛出AttributeError异常。 为了避免在方法中出现无限递归的情况,应该总是使用基类的方法来获取属性: >>> object.

    6.9K21

    Python中5对必知的魔法方法

    Python中,我们不需要对每个属性使用这些访问控制技术。但是,我们可以通过实现__getattr__ 和 __setattr__方法来实现某种控制。...具体地说,当访问实例对象的属性时,调用__getattr__ 方法;而在设置实例对象的属性时,调用__setattr__ 方法。 >>> class Product: ......否则,它将陷入无限递归。 设置formatted_name属性后,该属性将成为 __dict__对象的一部分,因此不会调用__getattr__。...它类似于__getattr__,但每次访问属性时都会调用它。在这一点上,它类似于__setattr__。...同样,你应该使用super()来实现__getattribute__方法,以避免无限递归的错误。 结论 在本文中,回顾了五对重要的特殊方法。通过这些方法,我们了解了与之相关的五个Python概念。

    55220

    Python面向对象编程Day 26部分

    多态是继承的改变和扩展的实现机制,即调用不同的类实例化得对象下的相同方法,实现的过程不一样。 (python中的标准类型就是多态概念的一个良好示范) 封装 本质是要明确的区分内外。...四个可以实现自省的函数(适用于类和对象):     hasattr(object,name,default=None)判断object中有没有一个name字符串对应的方法或属性没有打印False     ...t文件下的test1函数   双下划线开头(内置方法)的attr方法   属性不存在时触发__getattr__函数(最重要,用的比较多)   删除一个对象的属性时会触发__delattr__函数   ...__setattr__(self,key,value)设置时触发  函数内self.key=value这样会触发无限递归  应该这样设置self....__dict__[key]=value操作底层字典(del 什么.什么也会导致无限递归)  最后执行设属性操作可通过 f=函数名(参数)  f.key=value这样设定   print(函数名.

    42730

    Python知识点笔记-面向对象进阶篇

    python知识点范围:magic method魔术方法 magic method魔术方法是前后有两个下划线的属性; 创建对象的方法def __new__(cls ),重写的话可能需要一个星号和两个星号的参数...; 销毁对象用__del__(),由python回收机制调用; 对象之所以可以比较是因为有运算符魔术方法属性,只要能比较的都有的; 比较运算符__cmp__(self, other)【eq, lt, gt...,用__repr__这个魔术方法来转化; __str__, __unicode__方法也是返回字符串的,str是直接打印对象时调用的; __dir__可以控制调用dir()时要返回的内容; 大部分的内建方法都是有对应魔术方法的...,我们自己可以多多总结; __setattr__每次设置时都会调用; __getattr__, getattribute__查询魔术方法,每次没访问到和访问时会调用; 设置和查询魔术方法要防止无限递归,...容易出错; 递归1万次会报错; python本身没有访问控制,加了双下划线实际只是改了名字,我们仍然可以访问到; __delattr__删除时会访问到; python2里什么都不继承算是老式类,缺少一些功能

    32910

    Python 中几种属性访问的区别

    图 | 《借东西的小人阿莉埃蒂》剧照 起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__。...若查找链都获取不到属性,则抛出 AttributeError 异常。 一、__getattr__ 方法 这个方法是当对象的属性不存在是调用。...如果通过正常的机制能找到对象属性的话,不会调用 __getattr__ 方法。...如果类中还定义了 __getattr__ ,则不会调用 __getattr__()方法,除非在 __getattribute__ 方法中显示调用__getattr__() 或者抛出了 AttributeError...__getattribute__(self, item) 使用基类的方法来获取属性能避免在方法中出现无限递归的情况。 三、__get__ 方法 这个方法比较简单说明,它与前面的关系不大。

    2K30

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

    __dict__ {'lang': 'python'} # 实例中找不到flower属性调用属性 s.flower 'peach' 下面看看类中包含方法,__dict__如何发生变化 # 定义类...# 仔细看看 dir() 的结果,还有__dict__属性吗?没有了,的确没有了。也就是说__slots__把__dict__挤出去了,它进入了类的属性。...__getattr__(self,name):如果 name 被访问,同时它不存在的时候,此方法被调用。...__dict__,只要访问这个属性,就要调用`getattribute``,这样就导致了无限递归 # 访问不存在的成员,可以看到,已经被__getattribute__拦截了,虽然最后还是要报错的。...但是,在找 a.lang的时候,不仅实例属性没有,类属性中也没有,于是就调用了__getattr__()方法。在上面的类中,有这个方法,如果没有__getattr__()方法呢?

    2K20

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

    __dict__ {'lang': 'python'} # 实例中找不到flower属性调用属性 s.flower 'peach' 下面看看类中包含方法,__dict__如何发生变化 # 定义类...# 仔细看看 dir() 的结果,还有__dict__属性吗?没有了,的确没有了。也就是说__slots__把__dict__挤出去了,它进入了类的属性。...__getattr__(self,name):如果 name 被访问,同时它不存在的时候,此方法被调用。...__dict__,只要访问这个属性,就要调用`getattribute``,这样就导致了无限递归 # 访问不存在的成员,可以看到,已经被__getattribute__拦截了,虽然最后还是要报错的。...但是,在找 a.lang的时候,不仅实例属性没有,类属性中也没有,于是就调用了__getattr__()方法。在上面的类中,有这个方法,如果没有__getattr__()方法呢?

    3.9K20

    python-__getattr__ 和

    不是data descriptor或者没有属性则进行第2步。 3、查找实例t的__dict__中是否有at属性,有则返回,没有则到第3步。...3.2 ​ 4.2 返回__dict__['at'] 5、如果实例t的父类中有__getattr__方法,则调用该方法,没有则抛出AttributeError。...,仍然会首先调用getattribute,根据属性查找原则,在实例和类中都没有找到这个属性,于是执行getattr。...回过头来,getattribute会在调用类和实例的属性时无条件调用,所以可以用于权限鉴别、日志记录等操作;而getattr会在属性没有被找到的时候执行,因此可以用来做一些兜底的操作,可见这篇博客 另外注意重写...__getattribute__(),不要使用return self.xxx,否则self相当于又指向了自己,而getattribute会无条件调用,从而进入无限循环。

    40820

    10 Python 基础: 如何定制类,这里有答案

    01 Python 基础:Python入门必看之语法基础 02 Python 基础:列表及字典内置函数&方法内容梳理 03 Python 基础:Python函数及递归函数知识点梳理 04 Python...__getattr__ 正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。...要避免这个错误,除了可以加上一个score属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性。..., attr): if attr=='score': return 99 当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__...: 25 只是调用方式要变为: >>> s.age() 25 注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找。

    67830

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券