实例方法、类方法和静态方法
实例方法
第一个参数是"self",表示实例对象,通过它传递实例的属性和方法。只能由实例调用
类方法
使用装饰器@classmethod,第一个参数可以是"cls",也可以是"self",通过它传递类的属性和方法。可以由类和实例调用
假设我有一个学生类和一个班级类,想要实现的功能为:班级类含有类方法:执行班级人数增加的操作、获得班级的总人数,学生类继承自班级类,每实例化一个学生,班级人数都能增加。最后,我想定义一些学生,然后获得班级中的总人数
这个问题用类方法做比较合适,因为我实例化的时学生,但是如果我从学生这一个实例中获得班级总人数是不合理的,同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的
class ClassTest(object):
__num = 0
@classmethod
def addNum(cls):
cls.__num += 1
@classmethod
def getNum(cls):
return cls.__num
def __new__(self):
ClassTest.addNum()
return object.__new__(self)
class Student(ClassTest):
def __init__(self):
self.name = ""
a = Student()
b = Student()
print(ClassTest.getNum())
静态方法
使用装饰器 @staticmethod,不需要实例。静态方法主要用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有交互,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是独立的,单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。可以由类和实例调用
例如,定义一个关于时间操作的类,其中有一个获得当前时间的函数
import time
class TimeTest(object):
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
@staticmethod
def showTime():
return time.strftime("%H:%M:%S", time.localtime())
print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print(nowTime)
使用静态函数,既可以将获得时间的函数功能与实例解绑,我想获得当前时间的字符串时,并不一定需要实例化对象,此时更像是一种名称空间。我们可以在类外面写一个简单的方法来做这些,但是这样做就扩散了类代码的关系到类定义的外面,这样写就会导致以后代码维护的困难