定义一个时间类:
class Data_test(object):
def __init__(self, year=0, month=0, day=0):
self.day=day
self.month=month
self.year=year
def out_date(self):
print("year:", self.year)
print("month:", self.month)
print("day:", self.day)
我们可以先实例化一个 Data_test
对象,然后再调用 out_date()
方法:
>>> r = Data_test("2017-1-1")
>>> r.out_date()
year: 2017-1-1
month: 0
day: 0
假设有一种场景,用户输入的是字符串 "2017-1-1"
,我们需要改动 out_date()
函数,让它具有分割处理字符串的功能,才能实现我们的需求。
如果我们不想改动 out_date()
函数呢,解决办法是用 @classmethod
(类方法)来给类增加一个处理字符串的函数。
class Data_test(object):
def __init__(self, year=0, month=0, day=0):
self.day=day
self.month=month
self.year=year
@classmethod
def get_date(cls, data_as_string):
"""
输入一个字符串作为参数,根据该字符串得到 year, month, day 的值
根据这些值实例化一个 Data_test 对象,并返回
这里第一个参数是cls, 表示调用当前的类名
"""
year, month, day = map(int, data_as_string.split('-'))
# 实例化一个 Data_test 对象
date = cls(year, month, day)
#返回的是一个实例化后的类
return date
def out_date(self):
print("year:", self.year)
print("month:", self.month)
print("day:", self.day)
测试:
>>> r = Data_test.get_date("2017-1-1")
>>> r.out_date()
year: 2017
month: 1
day: 1
调用类方法的格式是:类名.类方法()
,不需要先实例化。
如果用 静态方法 @staticmethod
怎么实现呢?
class Data_test(object):
def __init__(self, year=0, month=0, day=0):
self.day=day
self.month=month
self.year=year
# 与类方法的区别在于,静态方法不需要 cls 参数
@staticmethod
def get_date_static(data_as_string):
year, month, day = map(int, data_as_string.split('-'))
return year, month, day
def out_date(self):
print("year:", self.year)
print("month:", self.month)
print("day:", self.day)
调用静态方法的格式是同样是:类名.类方法()
,不需要先实例化。
>>> d = Data_test.get_date_static("2017-1-1")
>>> r = Data_test(*d)
>>> r.out_date()
year: 2017
month: 1
day: 1