gpt4 book ai didi

python - 有没有办法将 __len__ 或 __eq__ 等方法实现为类方法?

转载 作者:IT老高 更新时间:2023-10-28 21:47:45 25 4
gpt4 key购买 nike

在 Python 中实现 __len__(self) 方法非常容易,它可以像这样处理 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 是类 AA 的一个实例也是类的一个实例,称为元类。默认情况下,Python 类是 type 类的实例(唯一的异常(exception)是在 Python 2 下,它有一些遗留的“旧式”类,这些类不继承自 object )。您可以通过执行 type(A) 来检查这一点...它应该返回 type 本身(是的,该对象已经被重载了一点)。

元类功能强大且令人费解,比我将要写的快速解释更值得……一个很好的起点是这个stackoverflow问题:What is a Metaclass .

对于您的特定问题,对于 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__ 不影响 Ainstances 的原因是 Python 中的属性解析首先检查实例 dict,然后再遍历类层次结构 [A, object],但它从不引用元类。而访问 A.__len__ 首先查询实例 A,然后遍历 它的 类层次结构,该层次结构由 [LengthMetaclass, type]

关于python - 有没有办法将 __len__ 或 __eq__ 等方法实现为类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7642434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com