python類有三種方法。
1.一般方法,即不加任何修飾的,直接用def定義的方法。如:
In [14]: class A:
...: def a(self):
...: print('一般方法')
...:
In [15]: class_A = A()
In [16]: class_A.a()
一般方法
2.staticmethod方法
經過staticmethod修飾過的類方法無需實例化即可被調用,而且該類方法不再需要self作爲第一參數。
In [107]: class A:
...: @staticmethod
...: def foo(x):
...: print(x)
...:
In [108]: A.foo(1)
1
這樣做的好處是,以後重構類的時候不需要修改init函數,只要額外添加需要處理的函數,然後使用@staticmethod修飾即可。
- classmethod 修飾的方法。類方法經 classmethod 修飾後無需實例化即可被調用,而且該類方法的第一參數不再是self,而是cls,表示類本身。
In [20]: class B:
...: a = 1
...: def __init__(self):
...: print('init class A')
...: @classmethod
...: def func1(cls):
...: print('classmehod func1')
...: print(cls.a)
...:
In [21]: B.func1()
classmehod func1
1
下面這個例子可以體現它的用途:
class Data_test2(object):
day=0
month=0
year=0
def __init__(self,year=0,month=0,day=0):
self.day=day
self.month=month
self.year=year
@classmethod
def get_date(cls,
string_date):
#這裏第一個參數是cls, 表示調用當前的類名
year,month,day=map(int,string_date.split('-'))
date1=cls(year,month,day)
#返回的是一個初始化後的類
return date1
def out_date(self):
print("year :")
print(self.year)
print("month :")
print(self.month)
print("day :")
print(self.day)
調用:
r=Data_test2.get_date("2016-8-6")
r.out_date()
輸出:
year :
2016
month :
8
day :
1
這樣子等於先調用get_date()對字符串進行處理,然後才使用Data_test的構造函數初始化。
這種用法爬蟲框架scrapy有經常用,scrapy提供一個settings.py文件,開發者可以根據自己的實際情況設置一些值。需要獲取這些值的類都有一個被classmethod方法修飾的from_settings()函數。這樣做的好處是,可以動態實例化一個類,增加代碼的靈活性。
下面是僞碼,僅供參考
#settings.py文件
DOWNLOAD_DELAY = 1 # 間隔時間
#某個文件
import settings
class A(object):
def __init__(self,delay):
self.delay = delay
@classmethod
def from_settings(cls,settings):
return cls(settings.DOWNLOAD_DELAY)