Как мы можем получить поведение по умолчанию __repr __ ()?

Как объяснено в Special Method Lookup :

Для пользовательских классов неявные вызовы специальных методов гарантируют, что они будут работать корректно, если они определены для типа объекта, а не в словаре экземпляра объекта ... Помимо обхода любых атрибутов экземпляра в интересах корректности, неявный поиск специальных методов обычно также обходит метод __getattribute__() даже метакласса объекта

blockquote>

(часть Я вырвался из объяснения причин этого, если вы заинтересованы в этом.)

Python не документирует точно, когда реализация должна или не должна искать метод по типу; все эти документы, по сути, являются реалиями, которые могут или не могут смотреть на экземпляр для специальных поисков методов, поэтому вы не должны рассчитывать ни на.

Как вы можете догадаться из результатов теста, в Реализация CPython, __repr__ является одной из функций, которые искали тип.


В 2.x ситуация немного отличается, в основном из-за наличия классических классов, но пока вы 'только создавая классы нового стиля, вы можете думать о них как о том же.


Наиболее распространенная причина, по которой люди хотят это сделать, - это обезьяна-патч разных экземпляров объекта, чтобы делать разные вещи , Вы не можете сделать это с помощью специальных методов, так что ... что вы можете сделать? Существует чистое решение и хакерское решение.

Чистым решением является реализация специального метода в классе, который просто вызывает обычный метод для экземпляра. Затем вы можете обезьян патч использовать этот обычный метод для каждого экземпляра. Например:

class C(object):
    def __repr__(self):
        return getattr(self, '_repr')()
    def _repr(self):
        return 'Boring: {}'.format(object.__repr__(self))

c = C()
def c_repr(self):
    return "It's-a me, c_repr: {}".format(object.__repr__(self))
c._repr = c_repr.__get__(c)

Хакерное решение заключается в создании нового подкласса «на лету» и переопределении объекта. Я подозреваю, что кто-то, у кого действительно есть ситуация, когда это хорошая идея, будет знать, как его реализовать из этого предложения, и любой, кто не знает, как это сделать, не должен пытаться, поэтому я оставлю это на этом.

13
задан Toothpick Anemone 10 March 2018 в 03:20
поделиться