当前位置: 首页 > 后端技术 > Python

Python中@staticmethod和@classmethod的区别

时间:2023-03-25 22:20:08 Python

一直搞不懂。专门研究了类方法和静态方法的区别,分享给大家。为了方便大家理解两者的区别,下面的示例代码将有助于找出区别:classA(object):deffoo(self,x):print"executingfoo(%s,%s)"%(self,x)@classmethoddefclass_foo(cls,x):打印“正在执行class_foo(%s,%s)”%(cls,x)@staticmethoddefstatic_foo(x):打印“正在执行static_foo(%s)"%xa=A()以下是对象实例调用方法的常用方法,对象实例a作为第一个参数隐式传递。a.foo(1)#executionfoo(<__main__.Aobjectat0xb7dbef0c>,1)使用classmethods时,将对象实例的类作为第一个参数传递,而不是隐式传递self。a.class_foo(1)#executingclass_foo(,1)也可以用这个类来调用class_foo。事实上,如果您将某个东西定义为类方法,可能是因为您打算从类中而不是从类实例中调用它。A.foo(1)会引发TypeError,但A.class_foo(1)工作正常:A.class_foo(1)#executingclass_foo(,1)人们找到类的方法之一方法目的是创建可继承的替代构造函数。使用静态方法时,self(对象实例)和cls(类)都不会作为第一个参数隐式传递。它们的行为类似于普通函数,除了你可以从实例或类中调用它们:a.static_foo(1)#executingstatic_foo(1)A.static_foo('hi')#executingstatic_foo(hi)特别注意这一点句子:静态方法用于对与类具有某种逻辑关系的函数进行分组。foo只是一个函数,但是当您调用a.foo它时,您不仅会得到该函数,还会得到该函数的“部分应用”版本,其中对象实例a绑定为该函数的第一个参数。foo需要2个参数,而a.foo只需要1个参数。a绑定到foo。这就是以下术语“绑定”的含义:print(a.foo)#<__main__.Aobjectat0xb7d52f0c>>的绑定方法A.foo,a未绑定到class_foo,但到A类绑定class_foo。print(a.class_foo)#>这里使用静态方法,即使是方法,a.static_foo也只是返回一个好的'ole函数。static_foo需要1个参数,a.static_foo也需要1个参数。print(a.static_foo)#当然,用类A调用static_foo也是一样的。print(A.static_foo)#总结一下互相调用的区别: