使用没有`@ classmethod`的类方法

时间:2017-12-24 10:53:12

标签: python class methods semantics

考虑:

class cla(object):
    def __init__(self,val):
        self.val = val

    def met(self):
        return self.val + 1

然后cla.met(cla(1))返回2

由于我不需要类cla的实例来使用方法met,这是否意味着它是一种类方法,即使我还没有使用装饰器{ {1}}?

我阅读https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods以更好地理解类方法是什么,但在某种程度上,在我看来@classmethod的预期含义已经存在于类的常规方法中 - 而且我'实际上我很困惑那里的例子,因为他们甚至不编译。

2 个答案:

答案 0 :(得分:1)

如果您有一个班级cla的实例:

instance = cla(1)

然后以下两个调用是等效的:

instance.met()
cla.met(instance)

请注意,第二个仅在您传递带有val属性的参数时才有效(因此您实际上执行需要......类似于cla类的实例),而第一个隐式调用类上定义的函数并将其自身作为参数传递。见docs on method objects。以下几行可以帮助阐明方法对象的内部结构:

>>> f = cla.met
>>> m = instance.met
>>> type(f)
<class 'function'>
>>> type(m)
<class 'method'>
>>> m.__self__ == instance
True
>>> m.__func__ == f
True

所以

>>> f(instance)
2

相同
>>> m.__func__(m.__self__)
2

这是instance.met()(又名m()又名m.__call__())的内幕。

答案 1 :(得分:1)

Open只是说cla.met(cla(1))的一种错综复杂的方式。答案很简单:cla(1).met()不是类方法。

一个类方法是

met

将被称为class cla(): @classmethod def met(cls, val): return val + 1

希望这能澄清其中的差异。