我们先来定义一个普通的类
class Demo:
def __init__(self):
pass
def common_method(self): # 这是一个普通方法
print("this is a common method")
demo = Demo()
demo.common_method()
在上面这块代码中,我们可以看到,类里面的普通方法,我们必须先把类实例化后才能引用。那有没有一种办法,我们不用实例化直接引用呢?
这儿介绍第一种特殊方法:静态方法(staticmethod)
静态方法是什么,举个例子,下面定义一个类
class Demo:
def __init__(self):
pass
def common_method(self): # 这是一个普通方法
print("this is a common method")
@staticmethod
def static_method(): # 这是一个静态方法
print("this is a static method")
Demo.static_method()
# 结果:
this is a static method
this is a common method
从这个例子中我们可以看到,我们不用去实例化Demo这个类就可以直接调用里面的方法,而这个方法必须在其上面加上修饰符@staticmethod,有这种修饰符修饰的方法叫做静态方法。(注意静态方法并没有一个指向自己的参数self)
另外,我们想在静态方法中调用类里的其他方法,但是静态方法并没有指向自己的参数self,我们可以这样做:
class Demo:
def __init__(self):
pass
def common_method(self): # 这是一个普通方法
print("this is a common method")
@staticmethod
def static_method(): # 这是一个静态方法
print("this is a static method")
Demo().common_method()
Demo.static_method()
# 结果:
this is a static method
this is a common method
还有第二种方法也可以做到上述功能:类方法(classmethod)
先举个例子,我们拓展一下上面的类,如下:
class Demo:
def __init__(self):
pass
def common_method(self): # 这是一个普通方法
print("this is a common method")
@staticmethod
def static_mathod(): # 这是一个静态方法
print("this is a static method")
@classmethod
def class_method(cls): # 这是一个类方法
print("this is a class method")
Demo.class_method()
# 结果:
this is a class method
从上述结果可以看到,class_method可以被@classmethod修饰成一个类方法,这个类方法可以不需要类被实例化就可直接引用。其中cls这个参数就像self一样属于类方法的强制性参数
那类方法和静态方法是一回事吗?
当然不,现在我们再来举一个类方法的应用例子
假如从控制台输入两个整数“a b”,要求你用加法求和,常规思路:
(1)把字符串传入实例对象,将字符串“a b”拆分成两个整数a,b
(2)再写一个方法,把两个数相加
很简单现在我们来实现一下:
class Demo:
def __init__(self,s):
self.num1 = int(s.split()[0])
self.num2 = int(s.split()[1])
def add(self):
print(self.num1 + self.num2)
demo = Demo("2 3")
demo.add()
# 结果:5
现在我们用类方法先去处理输入的字符串,再把处理好的参数传回实例对象
class Demo:
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
def add(self):
print(self.num1 + self.num2)
@classmethod
def process(cls, s):
num1 = int(s.split()[0])
num2 = int(s.split()[1])
return cls(num1, num2) # 这儿返回类自身的实例化对象
demo = Demo.process("2 3")
demo.add()
两个例子我们可以对比出,在实例化类前,我们可以对其输入参数先通过类方法处理,然后再返回类的实例化对象,这样的好处就是我们不用在构造方法__inti__里处理输入信息,也不用再参数传入类之前再用类外的函数处理。
版权声明:本文为weixin_44333824原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。