考虑:
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
的预期含义已经存在于类的常规方法中 - 而且我'实际上我很困惑那里的例子,因为他们甚至不编译。
答案 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
希望这能澄清其中的差异。