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

返回类变量属性时的python __getattribute__ RecursionError

在Python中,当访问类的实例的属性时,解释器会首先在实例的命名空间中查找该属性,如果找不到,则会继续在类的命名空间中查找。在这个过程中,如果属性是类变量,那么解释器会调用__getattribute__方法来获取属性的值。

__getattribute__是Python内置的一个特殊方法,用于处理属性访问操作。它在访问类实例的属性时被自动调用,可以自定义该方法来实现对属性的特殊处理。

然而,在使用__getattribute__方法时,需要注意避免无限递归调用的问题,否则会导致RecursionError递归错误。

下面是一个示例代码,演示了当在__getattribute__方法中返回类变量属性时可能出现的递归错误:

代码语言:txt
复制
class MyClass:
    my_class_variable = 10

    def __getattribute__(self, attr):
        # 会导致递归错误
        return self.my_class_variable

obj = MyClass()
print(obj.my_class_variable)

在上述代码中,当访问obj.my_class_variable时,__getattribute__方法会被调用,并尝试返回self.my_class_variable。然而,由于self.my_class_variable仍然属于类变量,因此再次触发__getattribute__方法的调用,形成无限递归调用,最终导致RecursionError

为了避免这个问题,我们可以在__getattribute__方法中使用super()函数来获取父类的属性值,而不是直接返回类变量属性。修改后的示例代码如下:

代码语言:txt
复制
class MyClass:
    my_class_variable = 10

    def __getattribute__(self, attr):
        if attr == "my_class_variable":
            return super().__getattribute__(attr)
        else:
            return "Attribute not found"

obj = MyClass()
print(obj.my_class_variable)

在这个修改后的代码中,我们首先判断要访问的属性是否为类变量my_class_variable,如果是,则使用super().__getattribute__(attr)来获取父类的属性值。这样就避免了无限递归调用,解决了RecursionError的问题。

腾讯云相关产品中与云计算领域的类变量属性访问没有直接关联的产品,因此无法提供相关的推荐产品和产品介绍链接地址。

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

相关·内容

Python - 面向对象编程 - 变量、实例变量属性、实例属性

什么是对象和 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 对象、实例对象 https://www.cnblogs.com/...,称为类属性/变量 在方法内部,通过 方式定义变量,称为实例属性/实例变量 self.变量名 在方法内部,通过 方式定义变量,称为局部变量 变量名=变量值 类属性属性定义 class...类属性方法注意点 无论是类属性还是方法,都无法像普通变量或者函数那样,在外部直接使用它们(方法后面详解) 可以将看做一个独立空间,类属性其实也是在体中定义变量方法是在体中定义函数...blogyuan 小菠萝回来了 会发现, 仍然返回之前值,而 实例对象.name 会返回修改名.name 原因: 本质上并不是修改类属性值,而是在定义一个新实例属性(下面详解) 实例对象...中,实例属性和类属性可以同名 但这种情况下使用实例对象将无法调用变量,它会首选实例变量,无论这个变量是否已定义 实例独享绑定新实例属性,会直接覆盖掉重名属性 实例属性、类属性同名栗子 class

1.3K20
  • Python3 类属性变量

    # -*- coding:utf-8 -*- # 类属性变量:只能由调用属性 class People(object): # 变量可以由所有的对象访问,但是对象只能访问,不可修改...self.name = name self.age = age self.school = school # 只能使用修改变量值.../变量 print (p1.total) # 对象没有办法修改变量值 # 给对象p1添加了一个total属性 # p1.total = 100 # print (p1.total) # 如果需要修改变量值...= p3.ssss # print (name) # 使用getattar(object,name,default)函数,会把获取到属性返回 # object 要获取属性对象 name 要获取属性名...(object,name) 判断某个对象是否拥有某个属性 # 判断会返回结果,如果有这个属性返回Ture,没有返回False s = hasattr(p3,'age') print (s) # 先判断是否有这个属性

    1.3K10

    Python属性

    Python有私有属性和方法吗? 我们在Python方法和属性上下文中使用这两个术语,公共和私有。 当属性是私有的,你不应该使用它;当方法是私有的,你不应该调用它。..._think()方法没有返回任何内容(或者返回None),但它将思想保存到._thoughts属性中,这也是私有的。让我们检查一下你是否能看到我私人思想: >>> marcin....但是当你知道自己在做什么,当你目的要求你使用私有属性Python可以实现这一点。这为Python开发者提供了许多额外机会。 使用私有方法或属性有点像在淋浴监视我,你可以看到我想隐藏东西。...脚注 ¹ 请记住,在Python中,方法是属性。因此,每当我提到属性隐私性,我指的是包括方法在内属性隐私性。 ² 名称改编有两个目的: 它提高了私有属性和方法保护级别。...它确保继承自父私有属性不会被继承它覆盖。因此,当你使用两个前导下划线,你不必担心该属性中被继承覆盖。 本文讨论是第一点。第二点超出了本文范围,我们将在其他时间讨论它。

    17530

    Python_属性

    1.类属性分类 属性分为: 数据属性:就是变量; 函数属性:就是中函数,在面向对象设计中通常称为方法; 和对象属性均使用点(.)来访问自己属性 2.属性 定义与函数极其相似...,我们可以使用函数作用域来理解属性调用方式。...我们可以通过属性字典来查询属性,如下图所示: ?...("门出产地为:", Door.address) #函数属性 # Door.open('self') #实参任意填 #数据属性,方法二 addr = Door....__dict__['off']('铝合金') ③ 总结 方法一实际上是调用方法二,即直接用点来调用属性是先调用属相字典,在取出对应结果。 3.其他特殊属性 ?

    1.1K20

    python私有变量

    若内部变量标示,如:当使用“from Mimport”,不会将以一个下划线开头对象引入。 2)__xx 双下划线表示是私有类型变量。...只能允许这个本身进行访问了,连子类也不可以用于命名一个类属性变量),调用时名字被改变(在FooBar内部,__boo变成_FooBar__boo,如self....(就是说这些是python内部定义变量名) 4)python默认成员函数和成员变量都是公开,没有像其他类似语言public,private等关键字修饰。...**情况就是当变量被标记为私有后,在变量前端插入名,在名前添加一个下划线"_",即形成了_ClassName__变量名.** Python内置类属性 __dict__ : 属性(包含一个字典,...由数据属性组成) __doc__ : 文档字符串 __module__: 定义所在模块(全名是'__main__.className',如果类位于一个导入模块mymod中,那么className

    1.2K10

    python属性监控学习

    知识回顾: 继承内建,形成一个自定义功能强大属于自己。...2、__new__使用,这个魔法方法是在对象实例化前所会调用方法。 ---- 本节知识视频教程 以下开始文字讲解: 一、传统属性监控模式 提问:传统属性我们是如何载入呢?...通过构造方法__init__来进行初始化属于属性。 今天主要学习对属性监控。 通过以前课程,我们学习过已经可以通过setter、getter来进行属性读写。...二、采用property绑定方式 好处:给我们提供直接操作属性方式监控属性,同时也可以通过del关键字使用使用来监控删除属性操作。...中构造方法 Python接口 python中利用API文档开发与学习 python和对象 python中函数递归VS循环 python中函数可变参数 python中自定义序列实现

    1.6K30

    python属性和方法总结

    一、属性总结(属性定义在方法外,对象属性定义在方法内) 理解: (静态)属性:(人类五官,理解为变量(动态)方法:(人类吃穿住行,理解为一个函数,至少带一个参数self,指向本身...) 对象:实例化,之后才能有属性和方法 1)属性,也是公有属性私有属性 2)对象公有属性;对象私有属性 3)函数局部变量;全局变量 4)内置属性 #!.../usr/bin/env python #encoding:utf-8 var6 = "全局变量var6" class Myclass(object):     var1 = "公有属性var1"...__var4 = "方法私有属性_var4"         var5 = "函数局部变量var5"         print var5         print var6              ...参数,使用staticmethod()函数处理(如果不处理,缺少self,调用时会报错),加载关于这个所有东西 4)内置方法 #/usr/bin/env python #encoding:utf-8

    1K10

    PYTHON】论Python私有变量、共有变量、全局变量、局部变量

    如私有变量、共有变量、全局变量、局部变量等。这里给大家介绍Python(class)中变量之间区别。...,而在__init__()构造方法中long变量也是可以被对象f直接引用,这就是说全局变量是被当做一个属性来存放,在Python中。    ...我们在截图中可以看到,在f__dict__中,存放了两个私有变量键值对,但是对于双下划线私有变量而言,它名字较之我们定义名字还是有所区别。...上面的截图中,在run()方法中定义r变量是一个局部变量,我们根本不可能调用它,因为它在run()方法运行完毕之后,属于它(局部变量r)那一块内存空间就会被Python解释器给释放掉,所以Python...全局变量被当做一个属性来存储,所以可以说直接通过.访问方式直接访问,访问如下:  1.4 公有变量  公有变量,也就是说该变量能够被该程序文档中任何代码块调用或者其他程序文档中任何代码块调用(

    4.2K20

    Python - 对象与属性

    ,其实涉及两个过程: 类属性绑定 实例属性绑定 使用绑定一词事实上更加确切,可以理解为属性并不是属于或实例Python中一切皆对象,每个属性也都是一个个现货鲜活对象,之所以这些对象被称之为...类属性绑定 Python作为动态语言,对象和实例对象都可以在运行时绑定任意属性,因此类属性绑定有两种时机: 编译(写在属性) 运行时 # 定义绑定类属性 print(f'定义绑定类属性...var of class 实例属性绑定 实例属性绑定也发生在两个时机: 实例生成 运行时 class_instance = Test() # 实例生成绑定实例属性 print(f'实例生成绑定实例属性...' print(f'实例运行时绑定实例属性{class_instance.var_of_instance}') >>> 实例生成绑定实例属性:Instance Var 实例运行时绑定实例属性:...需要特别说明是实例对象属性引用冲突问题,当中存在同名实例属性与类属性: 由于对象无法访问实例属性,因此对对象属性引用没有影响 实例属性有权访问二者,实现上会优先引用实例级属性,即同名属性会被覆盖

    2.6K10

    Python变量和成员变量使用注意点

    之前在用python写一个项目,发现一个很恶心bug,就是同由一个生成两个实例之间数据竟然会相互影响,这让我非常不解。...后来联想到java变量也有实例变量,因此翻阅了相关资料,发现python也有类似的变量和实例变量,比如下面的代码中: class A: x = 0 def __init__(self...明明x和y都是变量,在第二组print中为什么a.x和b.x一样,但是a.y和b.y就是不一样呢? 想了半天悟了一个道理。。。就是对于python来说,变量的确是所有共有的东西。...但是那是在我们用同一个引用情况下,比如对于[]对象append方法就是公用一个变量了;但是对于赋值语句来说,如果在中对变量使用了赋值语句,那么python就会生成一个该对象副本,以后操作都是基于这个副本而不会对原来对象造成影响...这样就解释通上面的现象了。 那么为了杜绝自己忘记变量和实例变量区别导致本不想公用变量时候公用了变量,最好办法就是在每个中使用变量时候重新初始化一下,这样就不会导致意外了。

    1.5K30

    Python 与继承

    Python 解释器会首先调用 __new__ 方法为对象分配空间,并返回对象引用,Python 解释器在获得对象引用后,将引用作为第一个参数,传递给 __init__ __new__ 通常用于控制生成一个实例过程.../events/all 二者都是访问属性方法,不同是所有通过实例访问属性都会触发 __getattribute__ 方法,而当访问属性不存在,会继续触发 __getattr__,也就是说 __getattribute...__ 一定会在 __getattr__ 之前触发,当 __getattribute__返回就不会再触发 __getattr__ __getattr__(self, name) self:函数中固定第一个参数...,返回一个由所有子类构成列表 这个方法只适用于新式,新式继承自 object,Python3版本中只支持新式Python2版本中可能不支持 class A: pass class B...__globals__ 与 func_globals __globals__ 可用于python2/3,以字典形式返回函数所在全局命名空间所定义全局变量,即找到该函数所有能够调用内容 class

    71540

    【说站】python变量和实例变量对比

    python变量和实例变量对比 区别 1、变量是所有对象共有的,其中一个对象改变其价值,其他对象得到是改变后结果。 2、实例变量是对象私有,某个对象改变其价值,不影响其他对象。...变量 不需要实例就可以直接使用,相当于绑定在上,而不是绑定在实例上。但是,变量也可以在实例中调用。所有类别实例之间可以共享值。...class Human:     name = '名字' #变量   print(Human.name) human = Human() print(human.name)   执行结果: 名字 名字...实例变量 实例化之后,每个实例单独拥有的变量。...(human.name)   执行结果: 名字 以上就是python变量和实例变量对比,希望对大家有所帮助。

    81840

    Python声明,使用,属性,实例

    Python定义以及使用: 定义: 定义Python中,定义使用class关键字来实现 语法如下: class className: "注释" 实体 (当没有实体...def __init__(self):     #self为实例参数 self.name_1 = "小强" #实例属性 定义必须要用实例参数.出来 那么接下来我们分别调用它属性...计算属性Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算属性。...()方法已经被我们写成了计算属性 继承定义: 在编写时候,并不是每一次都要从空白开始编写,当要编写和另外一个已经存在存在一定继承关系,就可以通过继承来达到代码重用目的,提高开发效率...'''帮助文档''' 帮助文档 可以在创建对象时候输入名和'('可以查看 statement 体 可以使用pass

    5.5K21

    Python 对象和实例对象访问属性区别、property属性

    参考链接: Python和实例属性 对象、实例对象、类属性、实例属性  下面的一个小demo,定义了一个省份  Province ,即对象 Province ,开辟了一块内存空间,空间中存放着...可以看出来,实例对象实例属性自己独有,对象属性可以被每一个实例对象所调用,即  类属性在内存中只保存一份实例属性在每个对象中都要保存一份 我们通过创建实例对象,如果每个对象需要具有相同名字属性...实例方法:由对象调用;至少一个self参数;执行实例方法,自动将调用该方法对象赋值给self;方法:由调用; 至少一个cls参数;执行方法,自动将调用该方法赋值给cls;静态方法:由调用...property属性功能是:property属性内部进行一系列逻辑计算,最终将计算结果返回(面向对象思想,封装)。 ...price 方法,并获取方法返回值 print(result)  新式继承object),具有三种@property装饰器  经典属性只有一种访问方式,其对应被 @property 修饰方法新式属性有三种访问方式

    3.6K00
    领券