我知道,当我们在对象之外时,我们必须使用setattr方法。但是,我在用unicode键调用setattr时遇到了问题,这导致我直接使用__setattr__。
class MyObject(object):
def __init__(self):
self.__dict__["properties"] = dict()
def __setattr__(self, k, v):
self.properties[k] = v
obj = MyObject()我得到了obj.properties的以下内容
setattr(obj, u"é", u"à"):提高UnicodeEncodeErrorsetattr(obj, "é", u"à"):{'\xc3\xa9': u'\xe0'}obj.__setattr__(u"é", u"à"):{u'\xe9': u'\xe0'}我不明白Python为什么有这些不同之处
发布于 2016-04-21 14:30:43
Python 2.7?仅限Ascii标识符。这包括代码中的2) - ascii重音,但不包括.1) - unicode重音。
Unicode identifiers in Python?
3)涉及在字典中设置unicode键。合法的。
请注意,__setattr__几乎从来不像您所做的那样被使用。它旨在设置对象的属性。而不是截取它并将它们填充到内部dict属性中。我也避免将属性作为名称,在get/Set意义上与属性混淆。
通常,您希望使用setattr,而不是双下划线变量。不像你的开场白。
您通常也不调用double下划线方法,而是定义它们,Python的底层数据协议代表您调用它们。有点像JavaBeans get/set隐式调用(我认为)。
__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是个大问题,我将评估Python2vs3-3有更好的、统一的unicode支持。您可能需要或不需要使用2.7而不是3,这是有很多原因的,但是unicode“推动”了3。
发布于 2016-04-21 14:33:41
Python 2不允许unicode标识符:
>>> é = 3
File "<stdin>", line 1
é = 3
^
SyntaxError: invalid syntax据推测,这一点是如此坚持,您无法在尝试时绕过它,因为setattr在调用__setattr__之前经历了一些处理。您可以通过在print的开头插入一个__setattr__来显示这一点:没有打印任何内容,所以这个问题不在您的代码中。
https://stackoverflow.com/questions/36772235
复制相似问题