假设以下类别:
class Class(object):
@classmethod
def getitem(*args):
print 'getitem %s' % (args,)
@classmethod
def __getitem__(*args):
print '__getitem__ %s' % (args,)
getitem方法的行为与预期一样:它接收Class
作为第一个参数,但是__getitem__
接收{}作为第一个参数:
^{pr2}$
在__getitem__
背后有什么魔力?在
Tags:
当您调用
x[test]
时,解释器检查type(x)
属性的__getitem__
。在Class[test]
的情况下,它是Class
的元类,即type
。如果您想要一个类范围的__getitem__
,请在一个新的元类中定义它。(不用说,这是一种魔力,就像你用元类做的任何事情一样)特殊方法是在类上查找的,而不是在实例上查找的-不像常规方法那样首先在实例上查找。请参见Python数据模型文档中的Special method lookup。在
将
Class
看作type
的实例,这意味着它首先查找您告诉它的内容:
^{pr2}$Class
自身属性中名为getitem
的方法。但是,当你使用它跳过这个,直接转到}),而是Python在本例中寻找的
type
(是Class
的类,或者它的元类),因此调用type.__getitem__(Class, test)
。所以,__getitem__
得到了type
作为它的第一个参数(它仍然会得到Class
,如果你显式地Class.__getitem__(test)
,它仍然会得到{__getitem__
并不存在。要使其存在,您需要为将其定义为实例方法的Class
定义自己的元类,而不是在Class
上将其定义为类方法。在相关问题 更多 >
编程相关推荐