Python setattr()也__setattr__有什么区别联系呢?看了个 stackoverflow 答案,不是太懂,各位求解释下。

2017-03-02 01:18:00 +08:00
 Tianny
  1. setattr(obj, attr, value) just calls obj.setattr(attr, value), at least for new-style classes.

  2. setattr(instance, name, value) is syntactic sugar for instance.setattr(name, value).

  3. You would only need to call object.setattr(...) inside a class definition, and then only if directly subclassing object -- if you were subclassing something else, Spam for example, then you should either use super() to get the next item in the heirarchy, or call Spam.setattr(...) -- this way you don't risk missing behavior that super-classes have defined by skipping over them directly to object.

  4. The code is probably using object.setattr for the exact purpose of skipping the superclass's setattr

  5. 英文好的麻烦给翻译翻译上面的 4 段话的意思。感谢!

3211 次点击
所在节点    Python
10 条回复
czheo
2017-03-02 07:39:42 +08:00
setattr(instance, name, value)是 instance.__setattr__(name, value)的语法糖。
rwecho
2017-03-02 08:41:16 +08:00
setattr(instance, name, value) 是静态方法,意思为 给一个实例赋值一个属性值

instance.setattr(name, value) 是面向对象方法, 意思为一个实例设置一个属性值.
dant
2017-03-02 08:56:16 +08:00
setattr 是你在外部调用的
__setattr__ 是你在类里面实现的
Tianny
2017-03-02 09:27:03 +08:00
@dant 意思就是我在外部用 setattr 其实是调用类里面的__setattr__方法喽?
Tianny
2017-03-02 09:28:10 +08:00
其实我主要想知道第三段和第四段的意思?
Tianny
2017-03-02 09:30:33 +08:00
@rwecho 那么这两者的功能是等价的吗?
rwecho
2017-03-02 11:26:47 +08:00
等价的.

我理解的意思是:

在类里面可以调用 self.attr(*) 也可以调用 super().attr(*). 这是继承的概念
调用 instance.attr(*)只会执行 instance 的 attr 的方法,从而隐藏了 super(*).

这在 OO 思想里面就是把静态方法变成实例方法, 是思想里面的差距, 和使用功能上没有差距.
另外通过 instance.attr(*) 可以达到链式表达式的效果
dant
2017-03-02 13:06:03 +08:00
@Tianny 你可以实现 __setattr__ 来改变属性被赋值时的行为
fy
2017-03-02 13:32:58 +08:00
5. 英文也不好,谢谢。
sunsol
2017-03-02 13:36:29 +08:00
setattr(obj,name,value)相当于 obj.name=value
而作为函数可以更方便调用,通常用于 name 为变动值时。

__setattr__(self,name,value)是自定义对象方法,
用来重新定义对像的 obj.name=value 时操作
默认行为为 self.__dict__[name]=value,
通常用于设置检查 value 是否合法的情况。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/344218

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX