特殊方法如__contains__
仅当在类上定义时才特殊,而不是在实例上定义(Python 2 中的遗留类除外,您应该not无论如何使用)。
那么,你的代表团在班级层面:
class A(object):
def __init__(self):
self.mydict = {}
def __contains__(self, other):
return self.mydict.__contains__(other)
我实际上更喜欢将后者拼写为return other in self.mydict
,但这是一个小风格问题。
Edit:如果“完全动态的每个实例特殊方法重定向”(如提供的旧式类)是必不可少的,那么用新式类实现它并不难:您只需要每个具有这种特殊需求的实例包裹在它自己的特殊类中。例如:
class BlackMagic(object):
def __init__(self):
self.mydict = {}
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__contains__ = self.mydict.__contains__
本质上,在一点点黑魔法重新分配之后self.__class__
到一个新的类对象(其行为与前一个类似,但有一个空字典,除了这个之外没有其他实例self
),您要分配给的旧式类中的任何位置self.__magicname__
, 分配给self.__class__.__magicname__
相反(并确保它是内置的或staticmethod
,不是一个普通的Python函数,当然除非在某些不同的情况下你确实希望它接收self
当在实例上调用时)。
顺便说一句,in
此实例上的运算符BlackMagic
类是faster碰巧,比之前提出的任何解决方案都要好——或者至少我是用我平时信任的人来衡量的-mtimeit
(直接进入built-in method
,而不是遵循涉及继承和描述符的正常查找路线,从而节省了一些开销)。
一个元类来自动化self.__class__
-per-instance 的想法并不难写(它可以在生成的类中做肮脏的工作)__new__
方法,如果在实例上分配的话,也许还可以设置所有魔术名称以实际分配在类上,或者通过__setattr__
或许多,many特性)。但只有当对此功能的需求确实广泛时,这才是合理的(例如,将一个巨大的古老 Python 1.5.2 项目移植到现代 Python,包括 Python 3),该项目自由地使用“每个实例的特殊方法”。
Do I 推荐“聪明”还是“黑魔法”的解决方案?不,我不这么认为:几乎总是以简单、直接的方式做事会更好。但“几乎”在这里是一个重要的词,很高兴能在罕见但并非不存在的情况下拥有如此先进的“钩子”,这些情况实际上可能需要使用它们。