Python目的的%属性前缀

时间:2015-03-20 23:24:22

标签: python object attributes setattr

我见过具有%values等属性的Python对象。我无法访问这些属性,因为它们会引发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可以setattr使用SyntaxError进行设置,但是会引发{{1}}?

2 个答案:

答案 0 :(得分:1)

  

%%在这里有任何目的或意义吗?

最有可能的是,正是为了防止您使用常规点表示法访问这些属性,因为正如您所见,您不能这样做。这会阻止你使用它们,以某种方式制作它们#private;#34; private"无论什么应用程序使用它们。但是,可能有更好的方法来实现这一目标。如果我看到这样的代码,我会称之为气味。

  

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

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

答案 1 :(得分:1)

%values不是Python中的valid identifier。正如在this question中发现的那样,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(),使其看起来像变量名称以百分号开头