關於類、方法、對象(實例):靜態方法


類里面的方法有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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM