它很容易实现__len__(self)
Python 中的方法,以便它处理len(inst)
像这样的调用:
class A(object):
def __len__(self):
return 7
a = A()
len(a) # gives us 7
您可以定义很多类似的方法(__eq__
, __str__
, __repr__
ETC。)。
我知道Python 类也是对象。
我的问题:我可以以某种方式定义,例如,__len__
以便进行以下工作:
len(A) # makes sense and gives some predictable result
你正在寻找的东西被称为“元类”......就像a
是类的一个实例A
, A
也是类的一个实例,称为元类。默认情况下,Python 类是type
类(唯一的例外是在 Python 2 下,它有一些遗留的“旧式”类,这些类不继承自object
)。你可以通过这样做来检查这一点type(A)
...它应该返回type
本身(是的,该对象已经重载了一点)。
元类非常强大且令人费解,值得比我要写的快速解释更多...一个很好的起点是这个 stackoverflow 问题:什么是元类 https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python.
对于您的特定问题,对于 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__
不影响实例 of A
Python中的属性解析首先检查实例字典,然后遍历类层次结构[A, object]
,但它从不查阅元类。而访问A.__len__
首先查阅实例A
,然后步行it's类层次结构,包括[LengthMetaclass, type]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)