在类中定义的函数称为方法,主要有三种:实例方法、类方法、静态方法。
class MyTest(): # 普通实例函数 def func1(self, arg1, arg2): pass # 类函数 @classmethod def func2(cls, arg1, agr2): pass # 静态函数 @staticmethod def func3(arg1, agr2): pass
三种函数的区别:
实例方法(instancemethod ) | 类方法(classmethod) | 静态方法(staticmethod) | |
---|---|---|---|
定义方式 | self作为第一个参数 | cls作为第一个参数 | 无强制参数 |
参数绑定的对象 | 类的实例,即用self来传递当前类的实例 | 类对象,即用cls传递当前类对象 | 无 |
调用方式 | 只能通过类的实例调用 | 类对象或类的实例均可调用 | 类对象或类的实例均可调用 |
访问类/实例成员 | 可访问类成员,不可访问实例成员 | 均不可访问类成员和实例成员 |
由于classmethod和staticmethod方法可以直接使用类对象调用,因此可在类实例化之前,通过classmethod或staticmethod方法,对类做一定的交互,提供额外的构造实例。
class Date(): '''类成员''' day = 0 month = 0 year = 0 def __init__(self, year=0, month=0, day=0,): '''实例成员''' self.year = year self.month = month self.day = day # 类函数 # (PS:由于cls表示类对象,而不是类实例。因此如果我们继承Date类,那么所有的子类也都将拥有trans_date1这个方法。) @classmethod def trans_date1(cls, date_of_string): # print(cls.year) true, @classmethod可访问类成员,无法访问实例成员 year, month, day = map(int, date_of_string.split('-')) return cls(year, month, day) # 返回类的实例 # 静态函数 @staticmethod def trans_date2(string_data): # print(year) false, @staticmethod均不可访问类成员和实例成员 year, month, day = map(int, string_data.split('-')) return Date(year, month, day) # 返回类的实例 def out_date(self): print("year: ", self.year) print("month: ", self.month) print("day: ", self.day) if __name__ == "__main__": # date = Date(2020, 8, 25) '''不需实例化类,直接通过 类名.函数名 调用类方法''' date1 = Date.trans_date1("2020-08-25") date1.out_date() '''不需实例化类,直接通过 类名.函数名 调用静态方法''' date2 = Date.trans_date2("2020-08-25") date2.out_date()
运行结果:
year: 2020
month: 8
day: 25
year: 2020
month: 8
day: 25
参考:https://www.cnblogs.com/agnewee/p/5653936.html