Ошибка переписки ipython при использовании пользовательского __getAttribute__Python

Программы на Python
Ответить
Anonymous
 Ошибка переписки ipython при использовании пользовательского __getAttribute__

Сообщение Anonymous »

У меня есть специальный __getattribute__, который должен изменять возвращаемое значение, если элемент не является методом (то есть атрибутом). Предположим, что все атрибуты (self.a, self.b и т. д.) имеют тип str.

class A:
def __init__(self):
self.a = 1

def __getattribute__(self, k):
attr = object.__getattribute__(self, k)
if type(attr) != types.MethodType:
return '{}!'.format(attr)
return attr
< /code>

Я получаю ошибку в ipython при получении представления экземпляров класса A < /code>, но я не понимаю, почему.

Например: < /p>

In [26]: a = A()
In [27]: a
Out[27]: ---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
~/miniconda3/lib/python3.7/site-packages/IPython/core/formatters.py in __call__(self, obj)
700 type_pprinters=self.type_printers,
701 deferred_pprinters=self.deferred_printers)
--> 702 printer.pretty(obj)
703 printer.flush()
704 return stream.getvalue()

~/miniconda3/lib/python3.7/site-packages/IPython/lib/pretty.py in pretty(self, obj)
380 # 1) a registered printer
381 # 2) a _repr_pretty_ method
--> 382 for cls in _get_mro(obj_class):
383 if cls in self.type_pprinters:
384 # printer registered in self.type_pprinters

~/miniconda3/lib/python3.7/site-packages/IPython/lib/pretty.py in _get_mro(obj_class)
318 # Old-style class. Mix in object to make a fake new-style class.
319 try:
--> 320 obj_class = type(obj_class.__name__, (obj_class, object), {})
321 except TypeError:
322 # Old-style extension type that does not descend from object.

AttributeError: 'str' object has no attribute '__name__'
< /code>

Но print (a) < /code> работает нормально < /p>

In [33]: print(a)



Примечание. В простом Python REPL он работает правильно.

>>> a = A()
>>> a



Подробнее здесь: https://stackoverflow.com/questions/544 ... tattribute
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»