類里面的方法有3種:類的實例方法(平時常用的帶有self的方法)、靜態方法(@staticmethod )、類方法(@classmethod
)
這里主要看一下類的實例方法和靜態方法的區別:
(1)實例方法只能被實例對象調用,第一個參數必須要默認傳實例對象,一般習慣用self;
(2)靜態方法(由@staticmethod裝飾的方法)、類方法(由@classmethod裝飾的方法),可以被類或類的實例對象調用;
先看如下代碼
其實上述代碼中的get_request()和post_request()方法可以寫為靜態方法(用pycharm的應該會見到提示,建議你這個方法改為靜態方法,其實如果都按照實例方法來寫的話,不改也不影響調用),因為這里並不需要通過實例來調用這兩個方法,它們只是做一些邏輯處理(處理get請求或post請求)
修改后如下:
# encoding: utf-8 import requests import json class RunMethod: @staticmethod # 構造為靜態方法后,既可以通過類的命名空間調用,也可以通過實例調用,即self def get_request(url, data): r = requests.get(url=url, params=data) re = r.json() return json.dumps(re, indent=2, ensure_ascii=False) def post_request(url, data): # 不構造為靜態方法,不能通過self調用,需要通過類的命名空間調用 r = requests.post(url=url, data=data) re = r.json() return json.dumps(re, indent=2, ensure_ascii=False) def run_main(self, method, url, data): if method == "GET": result = RunMethod.get_request(url, data) # 通過類名調用(類的命名空間)
# result = self.get_request(url, data) # 通過實例調用 else: result = RunMethod.post_request(url, data) # 因為post_request()只是一個普通函數,不是靜態方法和實例方法,所以只能通過類名調用 return result if __name__ == "__main__": url = "http://localhost:8088/ApprExclusiveInterface/api/enterprise/info/consult/save.v" data = { 'clientCode': '韓', 'topic': '測試接口', 'content': '測試接口', 'resrcType': 0 } r = RunMethod() # 需要注意的是如果類名后加上了(),表示對類進行了實例化 t = r.run_main("GET", url, data) print(t)
print(RunMethod.get_request(url, data)) # 直接通過類名調用
值得注意的是,假如我們在一個類下定義了2個方法A,B,其中A既不是靜態方法,也不是類(實例)方法,那么B在調用A時,或者在類外面調用類中的A方法時,必須使用類名來調用(即類的命名空間),形如:Class.A(),不過實際上並沒有人這樣干就是了(在類里面要么構造靜態方法,要么構造類方法)
參考:https://zhuanlan.zhihu.com/p/21101992
2018-05-08 22:40:00