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

为什么我不能在object的__setattr__方法中获取属性?

在Python中,__setattr__方法是一个特殊的方法,用于设置对象的属性值。然而,在__setattr__方法中获取属性值是不可能的,因为这样会导致无限递归调用。

当我们在__setattr__方法中尝试获取属性值时,会再次调用__setattr__方法,从而形成无限循环。这是因为在Python中,属性的赋值操作实际上是通过__setattr__方法来实现的。

为了避免这种无限递归的情况发生,Python规定在__setattr__方法中不能直接获取属性值。如果我们需要获取属性值,可以使用super().__setattr__()方法来设置属性值,然后再通过super().__getattribute__()方法来获取属性值。

以下是一个示例代码,演示了如何在__setattr__方法中设置属性值并获取属性值:

代码语言:txt
复制
class MyClass:
    def __setattr__(self, name, value):
        super().__setattr__(name, value)  # 设置属性值
        attribute_value = super().__getattribute__(name)  # 获取属性值
        print(f"属性{name}的值为:{attribute_value}")

obj = MyClass()
obj.my_attribute = "Hello"

输出结果为:

代码语言:txt
复制
属性my_attribute的值为:Hello

需要注意的是,为了避免无限递归调用,我们必须使用super()来调用父类的__setattr____getattribute__方法,而不能直接在__setattr__方法中使用self.attribute来获取属性值。

总结起来,我们不能在__setattr__方法中直接获取属性值,因为这会导致无限递归调用。为了获取属性值,可以使用super().__getattribute__()方法。

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

相关·内容

JavaScript中获取对象属性的不同方法

JavaScript中获取对象属性的不同方法 JavaScript提供了多种方式来获取对象的属性。这些方法可以根据不同的需求和情况来选择使用。...以下是其中一些主要方法: 一、点记法 点记法是最直接的方法。只需在对象后面加上点(.),然后是属性名。...age', 30]] 六、Object.getOwnPropertyNames()方法 这个方法返回一个包含对象自身所有属性(包括不可枚举的属性)的数组。...)); // 输出 ['name', 'age', 'nonEnumerable'] 七、Object.getOwnPropertyDescriptors()方法 这个方法返回一个描述对象的所有自有属性的对象...(包含name, age, nonEnumerable的描述符) 以上就是一些在JavaScript中获取对象属性的主要方式。根据你的需求和场景,选择合适的方法来访问和操作对象的属性。

7110
  • 为什么我不推荐另外2种快速传几百G文件的方法!

    引言 我是@程序员小助手 Rman,昨天看到一个题目,说在两台PC之间快速传几百G的文件,有没有什么好的快的办法。 考虑到操作系统平台,有Windows,Linux,MaxOS,这些都有差异。...所以给出了5种解决方法。但是只说了其中三种。参看 两台电脑之间如何快速传输几百G的文件?-两台,传输,文件,电脑 ? 这里说说为什么不推荐另外2种。 一个是网络存储。...为什么不推荐,因为pandownload的被举报,开发者收监,百度的名声臭的不可救药。所以不推荐。 国外的网速,你我都是知道的。 还有一个是,软件共享。 有人说这很简单啊,局域网有QQ,不就行了?...单说用户量超大的QQ,在Linux发行版的支持,都多少年没有更新了?这能用的了? 所以软件推荐,只能在软件和网络层面加快传输速度,还要搞跨平台的兼容,老复杂了。Bye!...回答发出后,有不少网友回复说, “我直接拔下来硬盘,接到新主机上。新主机启动,挂载为新的磁盘,立马可用!” 这个也是经不起推敲的。

    2.8K10

    java中为什么接口中的属性和方法都默认为public?

    4)为什么接口中的属性和方法都默认为public?Sun公司当初为什么要把java的接口设计发明成这样? ...【新手可忽略不影响继续学习】 答:如上所述,马克-to-win:既然接口强于抽象类能胜任作为和外部系统打交道的合同。换句话说,一般来讲和外部系统打交道,自然考虑用“接口”。...“外部”二字自然让我们做出如下结论:属性和方法都应默认为public。...因为是和外部系统打交道,存在很大的未知性,马克-to-win:我并不知道未来外部别人怎么用我们的接口,所以尽量少给别人设置障碍(少添点堵),就设置权限为public,出于这种考虑,Sun公司一开始就规定...,接口属性和方法默认就为public。

    84650

    关于 java 中的 set,get方法,而为什么不推荐直接使用public

    我不知道有没有人遇到过,有一段时间,我都觉得那些 set,get的用处何在,我直接写一个public直接拿不就行了,多爽,但是随着使用的频繁,越来越想去搜索一下这个问题,而不是按照官方的推荐,前辈们的使用都是建议...这里引入其中的一句话: 在任何相互关系中,具有关系所涉及的各方都遵守的边界是十分重要的事情,当创建一个类库时,就建立了与客户端程序员之间的关系,他们同样也是程序员,但是他们是使用你的类库来构建应用...如果所有的类成员对任何人都是可用的,那么客户端程序员就可以对类做任何事情,而不受约束。即使你希望客户端程序员不要直接操作你的类中的某些成员,但是如果没有任何访问控制,将无法阻止此事发生。...所有的东西都将赤裸裸的暴露在世人面前。 举一个简单的例子,我这边有处理苹果的逻辑,即get,set,但是至于怎么操作,这是我这边的工作,我不想让你知道,我是怎么摘的,怎么吃得。...补充说明,set字面意思设置,get获取,我们了解一下java面向对象编程的封闭性与安全性,private 修饰的set get方法将方法封闭在了一个特定类中,其他类就无法对其变量进行方法,这样就提高了数据的安全性

    1.5K20

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

    获取不存在的属性名 — __getattr__ __getattr__(self, name) 通过类实例点属性名可以实现类属性的访问,但有时我们需要定义当属性名不存在时的行为,这时就需要实现魔术方法:...__getattr__ 这个方法只有在用户访问的类属性不存在时才会被调用,通常,你可以在实现的 __getattr__ 中做兜底操作或抛出异常,也可以结合 __setattr__ 方法实现对某个属性的彻底控制...但是,运行上述代码却抛出了异常: AttributeError: ’TechlogTest’ object has no attribute ’values’ 这是为什么呢?...因为在 __init__ 方法中,对 values 成员初始化的行为让解释器自动去调用了 __setattr__ 方法,而在 __setattr__ 方法中,values 成员尚未被创建,因此抛出了异常...,其实是无需实现 __getattribute__ 方法,事实上,去主动实现 __getattribute__ 方法也是不建议的,因为这太容易造成无限递归。

    62720

    【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )

    文章目录 前言 一、获取 Activity 中的所有方法 二、获取方法上的注解 三、获取注解上的注解 四、通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方法.../ 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ; 在博客 【IOC 控制反转】Android 事件依赖注入 ( 事件三要素...| 修饰注解的注解 | 事件依赖注入步骤 ) 中 , 定义了 2 个注解 , 第一个是方法上的注解 , 用于修饰方法 ; 第二个是修饰注解的注解 , 该注解用于配置注入的方法 ( 事件监听方法 |...; 拦截相应的 onClick , onLongClick , onTouch 方法 , 执行自己的方法 , 其它方法正常执行 ; 一、获取 Activity 中的所有方法 ---- 通过反射获取...Activity 类 , 然后调用 Class 的 getDeclaredMethods 方法 , 获取 Activity 中的所有方法 ; // 获取 Class 字节码对象 Class<?

    3K20

    如何绕过Python readline的Tab-补全

    下面我将用详细的步骤来说明 Tab 补全的具体作用:1、问题背景在一个使用 Python 的应用程序中,我们使用了 cmd.Cmd 模块来构建命令行界面,而它的选项卡自动补全功能(Tab-completion...2、解决方案虽然我们并不完全知道为什么替换 sys.stdout 对象会导致问题,但有一种方法可以解决这个问题:直接将我们自己的文件对象传给 cmd.Cmd 构造函数。...__', '__setattr__'): return object....值得注意的是,我们传入的文件对象也能作为 cmd 实例中的一个 stdout 属性使用。...通过小小的改动居然可以达到意想不到的效果,就问牛不牛。当然如果有任何技术性的疑惑,可以评论区留言一起讨论。

    16410

    __setattr__,setattr(),getattr__,getattr()及__getattribute__的区别

    中 print "---------c.name--------" print c.name#动态建立属性name,本身在class中不存在,故才调用__getattr__ print "-------...注释解释的比较详细了,几乎把这几个函数都用了个遍,自己多看看多总结会有更多的收获,或许以后的某一天我回过头开看这段代码会显得多幼稚呢,哈哈。...---- setattr()和getattr() 接下来是对setattr()和getattr()的分析,刚开始学总容易把这个方法和上述的__setattr__()搞混,接下来演示下setattr()和...getattr()方法的使用。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    39020

    如何通过一些骚操作有效的控制Python类

    平时工作中,能用到的类基本都是可变的,无论是实例的属性,还是类的属性,也正是因为这样,所以python也是一个“鸭子类型”的编程语言。...has no attribute 'abc' >>> a.abc = 1 >>> a.abc 1 上面这段代码很简单,对于你来说一定也不陌生,在我们需要的时候动态的添加属性,这也是我们用python很爽的地方...__ AttributeError: has no attribute abc 这里的关键点有2个: __slots__ 方法,在类中,使用__slots__方法可以控制类的属性和方法...__setattr__方法,我们在__init__这个构造函数中,添加了这个方法,目的是为了设置一个在__slots__中存在的属性的值,而在__setattr__函数中,我们重写了他,致使对任意类和实例属性进行修改的时候...所以通过__setattr__,我们限制了实例属性“papapa”的任意修改。

    55040

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

    object._getattr_(self, name) 拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。...如下所示,ClassA中定义了__getattribute__方法,实例insA获取属性时,都会调用__getattribute__返回结果,即使是访问__dict__属性。...如果类自定义了__setattr__方法,当通过实例获取属性尝试赋值时,就会调用__setattr__。常规的对实例属性赋值,被赋值的属性和值会存入实例属性字典__dict__中。...自己实现__setattr__有很大风险,一般情况都还是继承object类的__setattr__方法。...__dict__) # 由于调用的'__setattr__', name属性没有加入实例属性字典中。

    1.3K70

    介绍Python的魔术方法 - Mag

    __setattr__(self, name, value) __setattr__ 是实现封装的解决方案,它定义了你对属性进行赋值和修改操作时的行为。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。有一点需要注意,实现__setattr__时要避免"无限递归"的错误,下面的代码示例中会提到。...强烈不推荐来定义__cmp__, 取而代之, 最好分别定义__lt__等方法从而实现比较功能。 __cmp__在Python3中被废弃了。...__coerce__在Python3中废弃了。 其他魔术方法 还没讲到的魔术方法还有很多,但有些我觉得很简单,或者很少见,就不再累赘展开说明了。...你可能会问, 为什么不是命名为__bool__? 我也不知道。 我只知道该方法在Python3中改名为__bool__了。 __dir__(self) 对实例使用dir()时调用。

    1.2K20

    python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    如何能够最方便的管理,就是我说同一句话,他们都能理解 他们拥有相同的方法 ''' class Chicken: @staticmethod def bark():...(不同的对象类型,拥有相同的方法,不同的结果) # 不管什么类型,他都与type这个方法 ---> python中多态的体现 # 多态在python中其实很常见,因为到处充斥着继承与组合 a = 10...语法的原理 __getattribute__ 该函数也是用来获取属性 在获取属性时如果存在__getattribute__则先执行该函数,如果没有拿到属性则继续调用__getattr__函数,如果拿到了则直接返回...__setattr__(key, value) # 这个不写将导致赋值不成功,得到None print('__setattr__') def __delattr__(self...__ __delitem__) 任何的符号,都会被解释器解释称特殊含义,例如 . [] () __getitem__ 当你用中括号去获取属性时 执行 __setitem__ 当你用中括号去设置属性时

    68240

    Python知识学习 -- day01

    print(dir(user)) - id()方法----查看变量、对象的地址默认返回整型(int)10进制 - type()方法----查看变量、对象的数据类型 - dir()方法----查看对象的内置的属性和方法返回列表...(这是我个人的学习观点) 为什么16进制的英文单词跟0x好像跟Heaxdecimal单词没有什么关联。...其中的x也不区分大小写。...如果找不到在当前类中找到方法就直接执行,不在搜索 没有找到,就依次查找下一个类中是否有对应的方法,找到执行,不在搜索 如果最后一个类,还没有找到方法,程序报错 class A(object):...A(object): 新式类 class A(): 旧式类 python 3.x版本中 class A:默认继承object python 2.x版本中 class A:则就是旧式类不包含object

    24110

    非常全的通俗易懂 Python 魔法方法指南

    我不打算深入讨论 __new__ ,因为它并不是很有用, Python文档 中 有详细的说明。 __init__(self,[…]) 类的初始化方法。...delattr(self, name) 这个魔法方法和 __setattr__几乎相同,只不过它是用于处理删除属性时的行为。...这个魔法方法可以被使用(毕竟,选择权在你自己),我不推荐你使用它,因为它的使用范围相对有限(通常我们想要在赋值时进行特殊操作,而不是取值时),而且实现这个方法很容易出现Bug。...下面的例子展示了实际应用中某些特殊的属性访问方法(注意我们之所以使用 super 是因为不是所有的类都有 __dict__ 属性): class AccessCounter(object): '...协议类似某些语言中的接口,里面包含的是一些必须实现的方法。在Python中,协议完全是非正式的,也不需要显式的声明,事实上,它们更像是一种参考标准。 为什么我们要讲协议?

    1.9K32

    Python OOP-4

    类的成员描述符(属性) 类的成员描述是为了在类中对类的成员属性进行相关操作而创建的一种方式 get:获取属性的操作 set:修改或添加属性操作 delete:删除属性的操作 如果想使用类的额成员描述符,...类的方式:适用多个类中的多个属性共用同一个描述符 property:适用当前类中使用,可以控制一个类中多个属性 属性修饰符:适用于当前类中使用,控制一个类中的一个属性 9....属性操作相关 __getattr__:访问一个不存在的属性时触发 __setattr__:对成员属性进行设置的时候触发 参数: self用来获取当前对象 被设置的属性名称,以字符串形式出现 需要对属性名称设置的值...作用:进行属性设置的时候进行验证或者修改 注意:在该方法中不能对属性进行赋值操作,否则死循环 运算类相关魔术方法 __gt__:进行大于判断的时候触发的函数 参数 self 第二个参数是第二个对象 返回值可以是任意值...类和对象的三种方法 实例方法 需要实例化对象才能使用的方法,使用过程中可能需要截至对象的其他对象的方法完成 静态方法 不需要实例化,通过类直接访问 类方法 不需要实例化 # 属性案例

    397107

    Python进阶——如何正确使用魔法方法?(上)

    访问控制 接下来,我们来看关于访问控制的魔法方法,主要包括以下几种: __setattr__:通过「.」设置属性或 setattr(key, value) 设置属性时调用 __getattr__:访问不存在的属性时调用...,我已经添加好了详细的注释。...__setattr__ 先来说 __setattr__,当我们在给一个对象进行属性赋值时,都会经过这个方法,在这个例子中,我们只允许对 name 和 age 这 2 个属性进行赋值,忽略了 gender...__getattr__ 再来看 __getattr__,由于我们在 __setattr__ 中忽略了对 gender 属性的赋值,所以当访问这个不存在的属性时,会调用 __getattr__ 方法,在这个方法中返回了默认值...很多同学以为这个方法与 __setattr__ 方法对等的,一个是赋值,一个是获取。其实不然,__getattr__ 只有在访问「不存在的属性」时才会被调用,这里我们需要注意。

    71332
    领券