最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python探索之靜態(tài)方法和類方法的區(qū)別詳解

 更新時(shí)間:2017年10月27日 16:40:34   作者:駑馬  
這篇文章主要介紹了Python探索之靜態(tài)方法和類方法的區(qū)別詳解,小編覺得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。

面相對(duì)象程序設(shè)計(jì)中,類方法和靜態(tài)方法是經(jīng)常用到的兩個(gè)術(shù)語。
邏輯上講:類方法是只能由類名調(diào)用;靜態(tài)方法可以由類名或?qū)ο竺M(jìn)行調(diào)用。

python staticmethod and classmethod

Though classmethod and staticmethod are quite similar, there's a slight difference in usage for both entities: classmethod must have a reference to a class object as the first parameter, whereas staticmethod can have no parameters at all.
Let's look at all that was said in real examples.

盡管 classmethod 和 staticmethod 非常相似,但在用法上依然有一些明顯的區(qū)別。classmethod 必須有一個(gè)指向 類對(duì)象 的引用作為第一個(gè)參數(shù),而 staticmethod 可以沒有任何參數(shù)。

讓我們看幾個(gè)例子。

例子 – Boilerplate

Let's assume an example of a class, dealing with date information (this is what will be our boilerplate to cook on):

class Date(object):
 
  def __init__(self, day=0, month=0, year=0):
    self.day = day
    self.month = month
    self.year = year

This class obviously could be used to store information about certain dates (without timezone information; let's assume all dates are presented in UTC).

很明顯,這個(gè)類的對(duì)象可以存儲(chǔ)日期信息(不包括時(shí)區(qū),假設(shè)他們都存儲(chǔ)在 UTC)。

Here we have __init__, a typical initializer of Python class instances, which receives arguments as a typical instancemethod, having the first non-optional argument (self) that holds reference to a newly created instance.

這里的 init 方法用于初始化對(duì)象的屬性,它的第一個(gè)參數(shù)一定是 self,用于指向已經(jīng)創(chuàng)建好的對(duì)象。

Class Method

We have some tasks that can be nicely done using classmethods.
Let's assume that we want to create a lot of Date class instances having date information coming from outer source encoded as a string of next format (‘dd-mm-yyyy'). We have to do that in different places of our source code in project.

利用 classmethod 可以做一些很棒的東西。

比如我們可以支持從特定格式的日期字符串來創(chuàng)建對(duì)象,它的格式是 (‘dd-mm-yyyy')。很明顯,我們只能在其他地方而不是 init 方法里實(shí)現(xiàn)這個(gè)功能。

So what we must do here is:
Parse a string to receive day, month and year as three integer variables or a 3-item tuple consisting of that variable.
Instantiate Date by passing those values to initialization call.
This will look like:

大概步驟:

解析字符串,得到整數(shù) day, month, year。

使用得到的信息初始化對(duì)象

代碼如下

day, month, year = map(int, string_date.split('-'))
date1 = Date(day, month, year)

理想的情況是 Date 類本身可以具備處理字符串時(shí)間的能力,解決了重用性問題,比如添加一個(gè)額外的方法。

For this purpose, C++ has such feature as overloading, but Python lacks that feature- so here's when classmethod applies. Lets create another “constructor”.

C++ 可以方便的使用重載來解決這個(gè)問題,但是 python 不具備類似的特性。 所以接下來我們要使用 classmethod 來幫我們實(shí)現(xiàn)。

@classmethod
 def from_string(cls, date_as_string):
 day, month, year = map(int, date_as_string.split('-'))
 date1 = cls(day, month, year)
 return date1
date2 = Date.from_string('11-09-2012')

Let's look more carefully at the above implementation, and review what advantages we have here:
We've implemented date string parsing in one place and it's reusable now.
Encapsulation works fine here (if you think that you could implement string parsing as a single function elsewhere, this solution fits OOP paradigm far better).
cls is an object that holds class itself, not an instance of the class. It's pretty cool because if we inherit our Date class, all children will have from_string defined also.

讓我們?cè)谧屑?xì)的分析下上面的實(shí)現(xiàn),看看它的好處。

我們?cè)谝粋€(gè)方法中實(shí)現(xiàn)了功能,因此它是可重用的。 這里的封裝處理的不錯(cuò)(如果你發(fā)現(xiàn)還可以在代碼的任意地方添加一個(gè)不屬于 Date 的函數(shù)來實(shí)現(xiàn)類似的功能,那很顯然上面的辦法更符合 OOP 規(guī)范)。 cls 是一個(gè)保存了 class 的對(duì)象(所有的一切都是對(duì)象)。 更妙的是, Date 類的衍生類都會(huì)具有 from_string 這個(gè)有用的方法。

Static method
What about staticmethod? It's pretty similar to classmethod but doesn't take any obligatory parameters (like a class method or instance method does).
Let's look at the next use case.
We have a date string that we want to validate somehow. This task is also logically bound to Date class we've used so far, but still doesn't require instantiation of it.
Here is where staticmethod can be useful. Let's look at the next piece of code:

staticmethod 沒有任何必選參數(shù),而 classmethod 第一個(gè)參數(shù)永遠(yuǎn)是 cls, instancemethod 第一個(gè)參數(shù)永遠(yuǎn)是 self。

@staticmethod
def is_date_valid(date_as_string):
 day, month, year = map(int, date_as_string.split('-'))
 return day <= 31 and month <= 12 and year <= 3999
 
# usage:
is_date = Date.is_date_valid('11-09-2012')

So, as we can see from usage of staticmethod, we don't have any access to what the class is- it's basically just a function, called syntactically like a method, but without access to the object and it's internals (fields and another methods), while classmethod does.

所以,從靜態(tài)方法的使用中可以看出,我們不會(huì)訪問到 class 本身 – 它基本上只是一個(gè)函數(shù),在語法上就像一個(gè)方法一樣,但是沒有訪問對(duì)象和它的內(nèi)部(字段和其他方法),相反 classmethod 會(huì)訪問 cls, instancemethod 會(huì)訪問 self。

總結(jié)

以上就是本文關(guān)于Python探索之靜態(tài)方法和類方法的區(qū)別詳解的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Python探索之爬取電商售賣信息代碼示例Python面向?qū)ο缶幊袒A(chǔ)解析(一)等,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持。

相關(guān)文章

  • 基于python的itchat庫實(shí)現(xiàn)微信聊天機(jī)器人(推薦)

    基于python的itchat庫實(shí)現(xiàn)微信聊天機(jī)器人(推薦)

    這篇文章主要介紹了基于python的itchat庫實(shí)現(xiàn)微信聊天機(jī)器人,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • python自動(dòng)裁剪圖像代碼分享

    python自動(dòng)裁剪圖像代碼分享

    這篇文章主要介紹了python自動(dòng)裁剪圖像代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Python多繼承原理與用法示例

    Python多繼承原理與用法示例

    這篇文章主要介紹了Python多繼承原理與用法,簡單描述了Python多繼承的相關(guān)概念、原理并結(jié)合實(shí)例形式分析了Python多繼承的具體定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • Python PySpider爬蟲框架安裝使用教程

    Python PySpider爬蟲框架安裝使用教程

    PySpider是一個(gè)Python編寫的分布式網(wǎng)絡(luò)爬蟲框架,它可以幫助開發(fā)者快速構(gòu)建和部署爬蟲,并支持爬蟲任務(wù)的分布式運(yùn)行,PySpider基于Twisted網(wǎng)絡(luò)框架和MongoDB數(shù)據(jù)庫,具有高效、穩(wěn)定、易用等特點(diǎn),同時(shí)還提供了一套Web界面,可以方便地查看爬蟲任務(wù)的運(yùn)行狀態(tài)和結(jié)果
    2023-11-11
  • Python中正則表達(dá)式妙用之以搜索電子郵件地址為例

    Python中正則表達(dá)式妙用之以搜索電子郵件地址為例

    這篇文章主要給大家介紹了關(guān)于Python中正則表達(dá)式妙用之以搜索電子郵件地址為例的相關(guān)資料,正則表達(dá)式經(jīng)常被用到,而自己總是記不全,匯總一份完整的以備不時(shí)之需,需要的朋友可以參考下
    2024-05-05
  • 使用 Python 清理收藏夾里已失效的網(wǎng)站

    使用 Python 清理收藏夾里已失效的網(wǎng)站

    這篇文章主要介紹了用 Python 清理收藏夾里已失效的網(wǎng)站,本文通過截圖實(shí)例代碼的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python編程調(diào)用百度API實(shí)現(xiàn)地理位置經(jīng)緯度坐標(biāo)轉(zhuǎn)換示例

    Python編程調(diào)用百度API實(shí)現(xiàn)地理位置經(jīng)緯度坐標(biāo)轉(zhuǎn)換示例

    這篇文章主要介紹了Python編程調(diào)用百度API來實(shí)現(xiàn)地理位置經(jīng)緯度坐標(biāo)轉(zhuǎn)換的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 高考要來啦!用Python爬取歷年高考數(shù)據(jù)并分析

    高考要來啦!用Python爬取歷年高考數(shù)據(jù)并分析

    轉(zhuǎn)眼間,高考的日子又要來臨了,不知道高考學(xué)子們準(zhǔn)備的怎么樣了,今天這篇文章簡單且隨意地分析一下高考的一些數(shù)據(jù),需要的朋友可以參考下
    2021-06-06
  • python使用hdfs3模塊對(duì)hdfs進(jìn)行操作詳解

    python使用hdfs3模塊對(duì)hdfs進(jìn)行操作詳解

    這篇文章主要介紹了python使用hdfs3模塊對(duì)hdfs進(jìn)行操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python中pywifi的具體使用

    python中pywifi的具體使用

    本文主要介紹了python中pywifi的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

荃湾区| 乐东| 五家渠市| 来凤县| 潢川县| 临邑县| 垫江县| 克什克腾旗| 班玛县| 浑源县| 肇东市| 武陟县| 鸡东县| 平阴县| 铁力市| 越西县| 河东区| 定结县| 扶沟县| 九江市| 桃源县| 孝感市| 西盟| 富顺县| 贺兰县| 电白县| 余姚市| 黎川县| 闻喜县| 古交市| 西乌珠穆沁旗| 隆德县| 宁国市| 隆子县| 贞丰县| 永和县| 临海市| 远安县| 南京市| 无为县| 和平县|