当前位置: 首页 > 面试题库 >

有没有办法将__len__或__eq__之类的方法实现为类方法?

慕震博
2023-03-14
问题内容

__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是类的一个实例AA是为好,被称为元类类的一个实例。默认情况下,Python类是type该类的实例(唯一的例外是Python
2,它具有一些旧式的“旧样式”类,这些类不是从继承的object)。您可以通过执行以下操作来检查type(A)
…它应该返回type自身(是的,该对象已经过载了一点)。


元类功能强大且绞尽脑汁,值得得到比我要写的快速解释更多的信​​息……

对于您的特定问题,对于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]



 类似资料:
  • 问题内容: 首先,我阅读了埃里克森对“为什么不能在Java接口中定义静态方法?”的有用答复。。这个问题不是关于“为什么”的问题,而是关于“然后如何做”的问题。 编辑:我的原始示例不适当地,但我将其保留在下面。 虽然我现在确信在大多数情况下我想做的是过度矫kill过正,但在一种情况下可能需要这样做: 我再举一个例子。现在,让我们采用一个适合于查找表的复杂功能,例如Bessel函数。这必须进行初始化,

  • 因为这个方法是在运行时执行的,所以需要对它进行测试吗

  • 构建基于链表的队列实现。由于以下两个错误,无法运行应用程序: 错误#1:错误:队列。ListIterator不是抽象的,并且不会覆盖迭代器中的抽象方法next(),其中Integer是一个类型变量:Integer扩展类队列中声明的对象。列表迭代器 错误#2:错误:队列中的next()。ListIterator无法在迭代器中实现next(),返回类型int与Integer不兼容,其中E、Intege

  • 有没有办法只在满足条件时才在Javafx中“渲染”组件?我有兴趣做一个具有不同角色的用户界面,如果角色允许,只需添加一个组件,我也想继续使用FXML。我没有读过类似的东西。

  • 问题内容: 这确实是一个好奇心,而不是一个问题。 为什么类没有方法?现在看来似乎应该当你认为它有一个事实,,等方法。 我知道您可以执行以下操作: 但是为什么没有方法呢? 问题答案: 原因是Scanner类旨在读取以空格分隔的令牌。这是包装基础输入流的便捷类。在扫描仪之前,您所能做的只是读取单个字节,如果要读取单词或行,这将是一个很大的麻烦。使用Scanner,您可以传入System.in,它会执行

  • 我有一个由多个类实现的接口,这些类也有一些额外的方法。如果我自动连接这个类。有没有办法自动安装这些额外的方法? 例如─ 界面 服务1 服务2 如果我尝试像这样直接自动连接服务- 然后我得到了类似这样的错误-