0

我见过具有类似属性的 Python 对象%values。我无法访问这些属性,因为它们会引发SyntaxError. 它们似乎也需要setattr在没有以下内容的情况下创建SyntaxError

class A(object):
    pass
a = A()
setattr(a, "%values", 42)
a.%values    # results in SyntaxError: invalid syntax
class B(object):
    def __init__(self):
        self.%values = 42    # results in SyntaxError: invalid syntax

%这里有什么目的或意义吗?为什么可以%values设置 using setattr,否则会引发 a SyntaxError

4

2 回答 2

1

% 在这里有什么目的或意义吗?

很可能正是为了阻止您使用常规点符号访问这些属性,因为正如您所见,您不能。这会阻止您使用它们,使它们以某种方式对使用它们的任何应用程序“私有”。不过,可能有更好的方法来实现这一点。如果我看到这样的代码,我会称之为气味。

为什么可以使用 setattr 设置 %values,否则会引发 SyntaxError?

属性存储在字典中,字典键可以是任何东西。它们不必遵循与 Python 标识符相同的规则;Python 所做的最多的事情就是验证它们是字符串。(一些旧版本的 Python 确实强制传递给的名称setattr是有效的 Python 标识符,但这在前一段时间已从语言中删除。)

于 2015-03-20T23:39:36.580 回答
1

%values不是 Python 中的有效标识符。正如在这个问题中发现的那样,setattr()只是直接更改对象的__dict__属性,所以没关系。object.__setattr__()在尝试进行正常变量赋值时调用,但它似乎也不关心有效标识符:

class A(object):
    pass
a=A()
a.__setattr__("%val",1) #works
print a.__dict__ #prints "{'%val': 1}"

setattr()__setattr__()如果在修改它之前存在,似乎调用对象函数__dict__

class A:
    def __setattr__(self,name,value):
        print "__setattr__ called"
a=A()
a.val=1 #prints "__setattr__ called"

但是,在实际代码中,我认为没有任何理由设置__dict__或调用__setattr__()setattr()使其看起来像变量名以百分号开头。

于 2015-03-20T23:39:54.980 回答