關於靜態方法和類方法的一些理解

NO IMAGE

剛學類的時候,對類的物件呼叫不是很透徹,所以有很多疑問,就像這個靜態方法和類方法,當時一頭霧水!
所以今天我就想來說一下關於python的靜態方法和類方法。
宣告一個靜態方法和類方法這裡我們只會說明用裝飾器,這是最常見的!
既然稱之為方法,那麼他們肯定都是在class語句內宣告的def語句,只不過與其他方法有些不同而已。

首先靜態方法,宣告方式

class Xstaticlass:
@staticmethod
def onemethod([**args]):
pass

如上的程式碼我們在類中宣告瞭一個靜態方法,首先說明了,靜態方法並沒有強制要求的引數,所有的引數都是可選的;它也遵從類的繼承;
我們可以通過類或是例項對靜態方法進行呼叫
重要的要知道,靜態方法依賴於class語句進行建立,但是呼叫時完全獨立了,也就是說完全可以當做是一個獨立的函式。

接下來是類方法,類方法和普通的方法不同之處在於其有第一個強制的引數時建立該方法的類(cls)(其他普通的方法第一個引數是例項self)
也就是呼叫該方法時一定要傳入這個類作為引數
以下我們以scrapy中一段程式碼作為事例程式碼:

import pymongo
class MongoPipeline(object):
collection_name = 'scrapy_items'
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
)
# 類方法
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db[self.collection_name].insert_one(dict(item))
return item

以上程式碼是scrapy連結MongoDB資料庫時使用的程式碼,我們只關注這個類方法這段:

    @classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
)

可以看出來類方法的宣告是用裝飾器@classmethod
第一個強制引數是cls,這個指的是類本身

當呼叫該方法是我們可以看出來,這是返回了一個類的例項呀