Эмуляция теста членства в Python: делегирование __ содержит __ к содержащему в нем объекту правильно

Рассмотрим svgwrite http://packages.python.org/svgwrite/

6
задан Juergen 20 June 2009 в 20:39
поделиться

1 ответ

Специальные методы, такие как __ contains __ ] являются специальными только тогда, когда они определены в классе, а не в экземпляре (за исключением устаревших классов в Python 2, которые вы должны , но не в любом случае использовать).

Итак, делайте свое делегирование на уровне класса:

class A(object):
    def __init__(self):
       self.mydict = {}

    def __contains__(self, other):
       return self.mydict.__contains__(other)

Я бы предпочел записать последнее как return other в self.mydict , но это незначительная проблема стиля.

Edit : if and when «полностью динамическое перенаправление для каждого экземпляра. специальных методов »(например, предлагаемые классы в старом стиле) незаменимы, нетрудно реализовать его с помощью классов нового стиля: вам просто нужно, чтобы каждый экземпляр, который имеет такую ​​особую потребность, был заключен в свой собственный специальный класс. Например: m измеряется с помощью моего обычного надежного -mtimeit (переход непосредственно к встроенному методу , вместо того, чтобы следовать обычным маршрутам поиска, включающим наследование и дескрипторы, немного снижает накладные расходы). 12109] Нетрудно написать метакласс для автоматизации идеи self .__ class __ на экземпляр (он может выполнять грязную работу в методе __ new __ сгенерированного класса, и, возможно, также установить все магические имена для фактического присвоения классу, если они назначены в экземпляре, либо через __ setattr __ , либо через многие, многие свойства). Но это было бы оправдано только в том случае, если бы потребность в этой функции была действительно широко распространенной (например, портирование огромного древнего проекта Python 1.5.2, в котором широко используются «особые методы для каждого экземпляра», на современный Python, включая Python 3).

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

18
ответ дан 8 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: