python之类方法和静态方法

在类中定义的函数称为方法,主要有三种:实例方法、类方法、静态方法。

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

原文地址:https://www.cnblogs.com/Maruying/p/13558427.html