当前位置: 首页 > 面试题库 >

setattr()和object .__ setattr __()有什么区别?

蒋高超
2023-03-14
问题内容

我知道您不能调用object.__setattr__未继承自的对象object,但是两者之间是否还有其他不同之处?如果这很重要,我正在使用Python
2.6。


问题答案:

再次阅读这个问题,我误解了@ paper.cut在问什么:经典类和新型类之间的区别(在Python 3+中不是问题)。我不知道答案。

原始答案*

setattr(instance, name, value)instance.__setattr__(name, value)**的语法糖。

您只需要object.__setattr__(...)在类定义内部进行调用,然后仅在直接子类化时objectSpam例如,如果您正在对其他子类进行子类化),则您应该使用该方法super()来获取层次结构中的下一项,或者进行调用Spam.__setattr__(...)-这样,不要冒险将超类直接跳过到,从而避免错过超类定义的行为object

*适用于Python 3.0+类和2.x新型类

**有两个实例,其中setattr(x, ...)x.__setattr__(...)不相同:

  • x本身__setattr__在专用字典中有一个(因此x.__dict__[__setattr__] = ...(几乎可以肯定这是一个错误)

  • x.__class__有一个__getattribute__方法-因为即使方法/属性存在,它也会__getattribute__拦截 每次 查找

注意:以下 两个警告适用于每个语法糖快捷方式:

  • setattr
  • getattr
  • len
  • bool
  • hash
  • 等等


 类似资料:
  • 问题内容: 我想知道使用ReentrentLock和Synchronized(object)有什么大不同吗? 为什么叫reentrentLock?允许来自同一线程的递归调用? 问题答案: 我想知道使用和会有很大的不同。 主要区别在于: 与锁定/解锁绑定到源代码的块结构。无论您如何执行此操作,退出块时都会释放一个锁。例如,如果块由于意外的异常而终止,它将被释放。 使用显式锁定不是这种情况,因此您可以

  • 问题内容: 我已经看过以前用来表示任何对象的通配符-但最近看到了以下用法: 由于所有对象都扩展了对象,所以这两种用法是同义词吗? 问题答案: 并且是同义的,正如你所期望的。 在某些情况下,泛型实际上并不是多余的。例如,将导致成为下删除,而与它会成为下删除。(如果你要保留与使用的前泛型API的兼容性,这可能很重要。) 来源:http : //download.oracle.com/javase/tu

  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: java中的以下内容之间有什么区别: 目的 参考编号 参考变量 当我看到这样的语句时: 这是类,但不是对象吗?如果是这样..我在其他地方看到了这一点: cos,如果是这样,那么..somewhere就像 本地是的子类别。那么在这种情况下意味着什么呢?它有什么作用? 问题答案: 对象本质上是堆中生活的一块内存。(对象的部分内存结构包括对该对象类的引用。) Java中的对象变量(如本例中的

  • 问题内容: 创建对象的基于构造函数的语法之间有什么区别: …以及这种文字语法: 尽管JSLint偏爱您使用对象文字表示法,但两者似乎都做相同的事情。 哪一个更好,为什么? 问题答案: 除了您的第二个对象创建对象并向其添加属性之外,它们都执行相同的操作(除非某人做了不寻常的操作)。但是文字表示法在源代码中占用的空间更少。可以很清楚地知道发生了什么,因此使用,您实际上只是在输入更多内容,并且(从理论上

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。

  • 发展至今(2020 年 6 月份),GCC 编译器已经更新至 10.1.0 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ 。 除此之外,当下的 GCC 编译器还支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序,甚至于 GCC 6 以及之前的版本还支持编译 Java 程序。但本