1. 程式人生 > >python類的三種方法

python類的三種方法

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修飾即可。

  1. 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)