首页
学习
活动
专区
工具
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.4K20
  • 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中,方法是类的属性。因此,每当我提到属性的隐私性时,我指的是包括方法在内的属性的隐私性。 ² 名称改编有两个目的: 它提高了类的私有属性和方法的保护级别。...它确保继承自父类的私有属性不会被继承它的类覆盖。因此,当你使用两个前导下划线时,你不必担心该属性在类中被继承类覆盖。 本文讨论的是第一点。第二点超出了本文的范围,我们将在其他时间讨论它。

    18130

    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—类的属性和方法总结

    一、类的属性总结(类的属性定义在方法外,对象的属性定义在方法内) 理解: 类的(静态)属性:(人类的五官,理解为变量) 类的(动态)方法:(人类吃穿住行,理解为一个函数,至少带一个参数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中类的属性监控学习

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

    1.6K30

    【PYTHON】论Python的类中的私有变量、共有变量、全局变量、局部变量

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

    4.4K20

    Python - 类中的对象与属性

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

    2.7K10

    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

    72940

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

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

    82940

    Python中类的声明,使用,属性,实例

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

    5.6K21

    Python property属性 - 将方法转化为变量的故事

    property属性的有两种方式 装饰器 即:在方法上应用装饰器 类属性 即:在类中定义值为property对象的类属性 装饰器方式 在类的实例方法上应用@property装饰器 Python中的类有经典类和新式类...,新式类的属性比经典类的属性丰富。...具有三种@property装饰器 In [45]: class FatBoss: ...: """python3中默认继承object类 ...: 以python2...有胖子老板的折扣,再也不怕冷了 注意 经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter...对象的类属性 当使用类属性的方式创建property属性时,经典类和新式类无区别 In [8]: class FatBoss: ...: def sell_ciggite(self

    74630
    领券