首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >obj.count =8或setattr(obj,'count',8)

obj.count =8或setattr(obj,'count',8)
EN

Stack Overflow用户
提问于 2013-11-11 15:34:35
回答 3查看 60关注 0票数 0

在蟒蛇里。使用setattr(object, 'var', valueobject.var = value方法有什么区别。他们俩似乎都在做同样的事

代码语言:javascript
复制
class Something(object):
    pass

x = Something()

setattr(x, 'count', 2) #sets count to be 2
x.count = 3            #sets count to be 3
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-11 15:35:47

它们确实做了同样的事情,但是不能使用带有属性设置语法的变量,而可以使用setattr()

换句话说,这是可行的:

代码语言:javascript
复制
foo = 'count'
setattr(x, foo, 2)

但这并不是:

代码语言:javascript
复制
foo = 'count'
x.foo = 2

使用setattr()进行动态属性设置,其中属性的名称是从变量中提取的。对静态属性使用object.attributename = value,在这里您事先知道名称。

此外,属性访问语法仅限于正确的Python标识符,而setattr()可以使用任何字符串。这意味着您可以使用:

代码语言:javascript
复制
setattr(x, '3 little piggies', 42)

因为Python标识符不允许空格,并且不能以数字开头,所以使用静态属性进行尝试将无法工作。

票数 4
EN

Stack Overflow用户

发布于 2013-11-11 15:41:11

正如其他人所提到的,它们本质上是一样的。然而,setattr(obj, 'attr', value)更普遍,因为它允许您通过语法构造obj.attr = value来完成无法完成的事情。

代码语言:javascript
复制
>>> class A(object):
...    pass
>>> a = A()
>>> setattr(a, 'foo bar', 5)  # space in the attribute name???
>>> print getattr(a, 'foo bar')
5
>>> a.'foo bar' = 7
  File "<stdin>", line 1
    a.'foo bar' = 7
          ^

SyntaxError:无效语法

是否应该利用Python的“特性”(提示:您可能不应该)是另一个问题。

票数 0
EN

Stack Overflow用户

发布于 2013-11-11 15:46:17

直接访问x.count会产生更高效的代码,我怀疑这是因为可以在解析/字节编译时解析属性访问。这在循环中可能特别明显。

给定的

代码语言:javascript
复制
def f(): setattr(x, 'count', 2)
def g(): x.count = 3

下面是dis在Python2.7上说的话:

代码语言:javascript
复制
>>> dis.dis(f)
  1           0 LOAD_GLOBAL              0 (setattr)
              3 LOAD_GLOBAL              1 (x)
              6 LOAD_CONST               1 ('count')
              9 LOAD_CONST               2 (2)
             12 CALL_FUNCTION            3
             15 POP_TOP
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE
>>> dis.dis(g)
  1           0 LOAD_CONST               1 (3)
              3 LOAD_GLOBAL              0 (x)
              6 STORE_ATTR               1 (count)
              9 LOAD_CONST               0 (None)
             12 RETURN_VALUE

因此,g产生的字节码较少,我怀疑它也更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19910073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档