Рассмотрим svgwrite http://packages.python.org/svgwrite/
Специальные методы, такие как __ 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).
Я рекомендую «умные» или «черные магические» решения? Нет, я не знаю: почти всегда лучше делать что-то простым и понятным способом. Но «почти» здесь важное слово, и приятно иметь под рукой такие продвинутые «крючки» для редких, но не несуществующих ситуаций, когда их использование действительно может быть оправдано.