Python 2.7? Только идентификаторы Ascii. Это включает ваш код в 2) - аксиальный акцент, но не .1) - акцент unicode.
Unicode identifiers in Python?
3) включает в себя вы установив Юникода ключ в словаре. Юридические.
Обратите внимание, что __setattr__ is почти никогда не предназначено для использования, как вы это делаете. Он предназначен для установки атрибутов для объекта. Не перехватывайте это и не наполняйте их внутренним атрибутом dict. Я бы также избегал свойств, как имя, смешивая с свойствами в смысле get/Set.
Как правило, вы хотите использовать setattr, а не двойной символ подчеркивания. В отличие от вашего вступительного предложения.
Вы обычно также не используете call методы двойного подчеркивания, которые вы определяете, и базовый протокол данных 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.
Я использую Python 2.7.10 (по умолчанию, окт. 14 2015, 16:09:02) –