蟒蛇2.7?仅限 Ascii 标识符。这包括您在 2) 中的代码 - ascii 重音但不包括 .1) - unicode 重音。
Python中的Unicode标识符?
3) 涉及您在字典中设置 unicode键。合法的。
请注意, __setattr__几乎永远不会像您一样使用。它旨在为对象设置属性。不要拦截它并将它们填充到内部 dict 属性中。我也避免使用属性作为名称,与 get/Set 意义上的属性混淆。
通常你想使用 setattr,而不是双下划线变体。不像你的开场白。
您通常也不调用双下划线方法,您定义它们,Python 的底层数据协议代表您调用它们。有点像 JavaBeans 获取/设置隐式调用(我认为)。
__setattr__ 可能很棘手。如果您不小心,它会以意想不到的方式阻止“设置活动”。
这是一个愚蠢的例子,
class Foo(object):
def __setattr__(self, attrname, value):
""" let's uppercase variables starting with k"""
if attrname.lower().startswith("k"):
self.__dict__[attrname.upper()] = value
foo = Foo()
foo.kilometer = 1000
foo.meter = 1
print "foo.KILOMETER:%s" % getattr(foo, "KILOMETER", "unknown")
print "foo.meter:%s" % getattr(foo, "meter", "unknown")
print "foo.METER:%s" % getattr(foo, "METER", "unknown")
输出:
foo.KILOMETER:1000
foo.meter:unknown
foo.METER:unknown
你需要有一个else
之后if
:
else:
self.__dict__[attrname] = value
输出:
foo.KILOMETER:1000
foo.meter:1
foo.METER:unknown
最后,如果您刚刚开始并且 unicode 很重要,我会评估 Python 2 vs 3 - 3 具有更好、统一的 unicode 支持。您可能需要也可能不需要使用 2.7 而不是 3,但 unicode “推向” 3 的原因有很多。