python中,类方法(@classmethod)和静态方法(@staticmethod)都是为了对类参数进行一些预处理的过程,
方便使用不同参数对类的调用
静态方法:
class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day def __str__(self): return '{year}/{month}/{day}'.format(year=self.year, month=self.month, day=self.day)
@staticmethod def parse_from_string(date_str): #虽然是定义在类的内部,但静态方法不需要用self参数,即不用实例本身作为参数 year, month, day = tuple(re.split(r'-|\.', date_str)) return Date(int(year), int(month), int(day)) #当类的名字更改时,此处名字也要改。为了解决这个问题,所以要使用类方法
# 当实例化Date时,使用parse_from_string方法,传入的参数可以接收单个字符串,然后再拆分成三个参数给
构造函数__init__来生成实例,如下面:
if __name__ == '__main__':
date_str = '2008-1-1'
new_day = Date.parse_from_string(date_str)
print(new_day) // 打印2008/1/1
类方法:
如上所说,静态是可以提前处理类的传入参数。静态方法不一定要返回类本身,即静态方法可以return 其他东西(如字符串,布尔值等)。但当静态方法要返回类本身的时候,如上面的例子,如果修改定义的类名,也要对静态方法中的类名进行修改。为了避免这一个问题,可以采用类方法:
class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day def __str__(self): return '{year}/{month}/{day}'.format(year=self.year, month=self.month, day=self.day)
@classmethod def parse(cls, date_str): #与静态方法实现同样的功能,只是要添加类本身的参数,这里的cls不是固定的,可以用其他变量来替换 year, month, day = tuple(re.split(r'-|\.', date_str)) return cls(int(year), int(month), int(day))
# 当实例化Date时,使用parse方法,传入的参数可以接收单个字符串,然后再拆分成三个参数给
构造函数__init__来生成实例,如下面:
if __name__ == '__main__':
date_str = '2008-1-1'
new_day = Date.parse(date_str)
print(new_day)
私有属性
python中,通过在属性前添加双下划线可以让一个类变量或者方法变成私有,外面是“不能”访问该属性,继承该类的子类也不能访问。注意,并不是绝对的不能访问,可能通过另外一个方法来访问到定义的私有属性(实例名._类名.带双下划线的私有属性名)
class User: def __init__(self, birthday): self.__birthday = birthday # __birthday就是私有属性 def get_age(self): return datetime.date.today().year - self.__birthday.year if __name__ == '__main__': user = User(Date(2000, 1, 1)) print(user.__birthday) # 报错,提示没有该属性 print(user._User__birthday) # 正常打印2001/1/1 print(user.get_age())