Python % 属性前缀的用途

Python purpose of % attribute prefix

我见过 Python 个具有 %values 等属性的对象。我无法访问此类属性,因为它们会引发 SyntaxError。他们似乎还要求在没有 SyntaxError:

的情况下创建 setattr
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

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

Does the % have any purpose or meaning here?

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

Why can %values be set using setattr, but otherwise raises a SyntaxError?

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

%values 不是直接的 valid identifier in Python. As discovered in this question, setattr() just changes an object's __dict__ 属性,所以这无关紧要。 object.__setattr__() 在尝试正常的变量赋值时被调用,但它似乎也不关心有效标识符:

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

setattr() 似乎在修改其 __dict__:

之前调用对象 __setattr__() 函数(如果它存在)
class A:
    def __setattr__(self,name,value):
        print "__setattr__ called"
a=A()
a.val=1 #prints "__setattr__ called"

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