Создание класса Python, который содержит свое значение в виде строки в верхнем регистре, не работает - PullRequest
0 голосов
/ 14 июля 2011

Почему это не работает?

>>> class A (unicode):
...     def __init__ (self, value):
...         super(unicode, self).__init__(str(value).upper())
...
>>> assert A('hello') == u'HELLO'

Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    assert A('hello') == u'HELLO'
AssertionError
>>>

Я знаю, что без init метода инициализация объекта по умолчанию будет использовать классы Unicode init (спасибо, MRO), и я знаю, что мой init метод вызывается, но, похоже, он не хочет работать.Даже когда я добавляю дополнительную строку и явно устанавливаю значение параметра value в значение upper, оно все равно не хочет работать.

Хотя я могу (и, вероятно, придется) определить repr и str специальные классы, чтобы получить желаемый эффект, мне немного любопытно, почему это не работает.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

unicode являются неизменяемыми объектами используют __new__ вместо __init__:

class A (unicode):
    def __new__ (cls, value):
       return unicode.__new__(cls, str(value).upper())

print A('hello')
u'HELLO'
2 голосов
/ 14 июля 2011

Вместо super(unicode, self) вы, вероятно, захотите super(A, self) - первым будет object.__init__.

Кроме того, поскольку объекты Unicode являются неизменяемыми, __init__ ничего не делает.Вместо обычной инициализации с помощью __init__ (что также предотвратит интернирование ), конструктор, который вы хотите переопределить, будет __new__:

class A (unicode):
    def __new__(cls, value):
        return super(A, cls).__new__(cls, str(value).upper())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...