【问题标题】:Python purpose of % attribute prefix% 属性前缀的 Python 用途
【发布时间】:2015-03-20 23:24:22
【问题描述】:

我见过具有%values 等属性的 Python 对象。我无法访问此类属性,因为它们会引发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

【问题讨论】:

  • 你为什么要创建一个带有 % 符号的变量? % 是一个运算符,这就是您收到语法错误的原因。只需使用 getattr() 即可访问它

标签: python object attributes setattr


【解决方案1】:

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

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

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

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

【讨论】:

  • 值得注意的是,您可以通过getattr(a, "%value")a.__dict__["%value"]以迂回的方式访问它们(很可能这是一些奇怪的访问控制尝试)跨度>
【解决方案2】:

%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() 似乎在修改其__dict__ 之前调用对象__setattr__() 函数,如果它存在的话:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2017-09-07
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多