__len__(self)
在Python中实现方法非常容易,这样它就可以处理这样的len(inst)
调用:
class A(object):
def __len__(self):
return 7
a = A()
len(a) # gives us 7
而且有很多相似的方法,你可以定义(__eq__
,__str__
,__repr__
等)。我知道Python类也是对象。
我的问题:例如,我可以以某种方式进行定义,__len__
以便进行以下工作:
len(A) # makes sense and gives some predictable result
你正在寻找被称为“元类” ......就像a
是类的一个实例A
,A
是为好,被称为元类类的一个实例。默认情况下,Python类是type
该类的实例(唯一的例外是Python 2,它具有一些旧式的“旧样式”类,这些类不是从继承的object
)。您可以通过执行以下操作进行检查type(A)
...它应该返回type
自身(是的,该对象已经有点过载)。
元类功能强大且绞尽脑汁,值得得到比我将要写的快速解释更多的信息……一个很好的起点是这个stackoverflow问题:什么是元类。
对于您的特定问题,对于Python 3,以下代码创建一个元类,该元类使用别名len(A)
来调用A上的类方法:
class LengthMetaclass(type):
def __len__(self):
return self.clslength()
class A(object, metaclass=LengthMetaclass):
@classmethod
def clslength(cls):
return 7
print(len(A))
(注意:上面的示例是针对Python 3的。对于Python 2,语法略有不同:您将使用class A(object):\n __metaclass__=LengthMetaclass
它而不是将其作为参数传递。)
究其原因LengthMetaclass.__len__
,不影响情况的A
是在Python首先检查属性分辨率的情况下字典,然后走的类层次结构[A, object]
,但它从来没有咨询的元类。而访问A.__len__
首先要查询实例A
,然后遍历它的类层次结构,该层次结构由组成[LengthMetaclass, type]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句