python中@staticmethod方法的使用
作者:elie813
python @staticmethod方法
python中@staticmethod方法,类似于C++中的static,方便将外部函数集成到类体中,主要是可以在不实例化类的情况下直接访问该方法,如果你去掉staticmethod,在方法中加self也可以通过实例化访问方法也是可以集成。
class Test: def __init__(self,num): self.num = num; def cout_num(self): print(self.num) @staticmethod def print_num(): print("Hello World") if __name__ == "__main__": obj = Test(10) """实例化成员方法""" obj.cout_num() """直接访问静态方法""" Test.print_num() """实例化 访问静态方法""" obj.print_num()
输出结果
10
Hello World
Hello World
@staticmethod和@classmethod的区别
一个比较简单粗暴的区分方式
要决定是使用@staticmethod还是@classmethod,你必须看看类方法内部。如果你的方法访问了类中的其他变量/方法,那么就使用@classmethod。
另一方面,如果方法没有接触到类中的任何其他变量,那么就使用@staticmethod。
其设计有更深的逻辑联系:
classmethod
:主要用于替代构造函数。staticmethod
:不使用对象的状态,甚至不使用类本身的结构。它可以是一个类外部的函数。它只放在类的内部,用于分组具有类似功能的函数(例如,像Java的数学类静态方法)
示例代码:
@classmethod Person.printAge = classmethod(Person.printAge) @staticmethod Calculator.add_numbers = staticmethod(Calculator.add_numbers)
能看懂这两行代码,应该就能理解什么是静态方法,什么是类方法了吧。
当然,看的不太懂也没有关系,下面通过栗子来详细的解说一下。
类方法@classmethod
什么是类方法?
类方法是绑定到类而不是其对象的方法。
它不需要创建类实例,就像staticmethod 一样。
静态方法 @staticmethod
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
python staticmethod 返回函数的静态方法。
该方法不强制要求传递参数,
声明一个静态方法:
class C(object): @staticmethod def f(arg1, arg2, ...): ...
可以不实例化调用该方法 C.f()
实现实例化使用 C().f()
什么时候使用@staticmethod
当某个方法(函数)不需要用到对象中的任何资源,将这个方法改为一个静态方法,
加上@staticmethod;
这个函数的形参不需要添加 self
加上之后, 这个方法就和普通的函数没有什么区别了, 只不过写在了一个类中, 可以使用这个类的对象调用,也可以使用类直接调用。
区别
静态方法和类方法之间的区别在于:
静态方法对类一无所知,只处理参数。
类方法适用于类,因为它的参数始终是类本身。
类方法可以由类及其对象调用。
Class.classmethod() Class().classmethod()
但无论如何,class方法始终附加到一个类,其中第一个参数作为类本身,cls。
def classMethod(cls, args…)
五、例子
class Person: age = 25 def printAge(cls): print('The age is:', cls.age) Person.printAge = classmethod(Person.printAge) Person.printAge()
class Person: age = 25 @classmethod def printAge(cls): print('The age is:', cls.age) Person.printAge()
注意:
你会发现改变了代码,但是结果还是一样的。你细心就会有所发现,没错,代码中的:
****
@classmethod 等价于 Person.printAge = classmethod(Person.printAge)
实例方法可以调用实例方法、类方法、静态方法。
类对象只能调用类方法、静态方法。
classmethod与staticmethod用法类似,classmethod可以通过staticmethod代替,在通过类调用时,这两者对于调用者来说是不可区分的。这两者的区别在于,classmethod增加了一个对实际调用类的引用。
1.方法可以判断出自己是通过基类被调用,还是通过某个子类被调用
2.通过子类调用时,方法可以返回子类的实例而非基类的实例
3.通过子类调用时,方法可以调用子类的其他classmethod
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。