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

科科斯蒂亚:

__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
艾丽·柯林斯(Eli Collins):

你正在寻找被称为“元类” ......就像a是类的一个实例AA是为好,被称为元类类的一个实例。默认情况下,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

有没有办法确保实现接口的类实现静态方法?

有没有办法使实现接口Ae的每个类都具有将Ba实现为属性的具体类之一的列表?

如果将类作为 <T> 发送,有没有办法获取类的方法?

有没有办法将类对象一般地传递给方法

有没有办法将活动窗口检测器实现为切换?

有没有办法在其实现的接口之一的默认方法中获取对象的类?(爪哇)

有没有办法将类中的所有方法设置为 Django 中的原子事务?

有没有办法禁止派生类中的基类方法调用?

有没有办法从另一个方法调用类方法?

有没有办法调用具有非pythonic参数的cdef类方法?

有没有办法在Python中覆盖现有(系统)类上的方法?

有没有办法在抽象类中具有可选方法?

有没有办法知道该方法是 Swift 中的协议实现?

有没有办法在 Ruby 中强制实现接口方法?

有没有办法不用Java实现接口方法?

有没有办法将方法作为参数传递给方法?

有没有办法将输入流编码记忆有效的方法

有没有办法使用存储库而不应用库基类的方法吗?

有没有办法在 ByteBuddy 代理之前对加载的类的方法调用advice()?

有没有办法从内部方法更改类变量

有没有办法听另一个类的方法执行?

有没有办法在Ruby中随机调用特定类的方法?

有没有办法在python中的用户定义类上定义list(obj)方法?

有没有办法通过 node.js 访问不是 main 方法的 Java 类?

有没有办法从类中的方法操作全局数据框?

有没有办法在最终方法中返回当前类类型?

Android/Java:有没有办法存储方法?

有没有办法重写__format__方法