解析python 類(lèi)方法、對(duì)象方法、靜態(tài)方法
python中實(shí)現(xiàn)靜態(tài)方法和類(lèi)方法都是依賴(lài)于python的修飾器來(lái)實(shí)現(xiàn)的。 對(duì)象方法有self參數(shù),類(lèi)方法有cls參數(shù),靜態(tài)方法是不需要這些附加參數(shù)的。
1、我們已經(jīng)討論了類(lèi)/對(duì)象可以擁有像函數(shù)一樣的方法,這些對(duì)象方法與函數(shù)的區(qū)別只是一個(gè)額外的self變量
# -*- coding:utf-8 -*- #!/usr/bin/python # Filename: method.py class Person: grade=1 def __init__(self,name): self.name = name def sayHi(self):#加self區(qū)別于普通函數(shù) print 'Hello, your name is?',self.name @staticmethod #聲明靜態(tài),去掉則編譯報(bào)錯(cuò);還有靜態(tài)方法不能訪問(wèn)類(lèi)變量和實(shí)例變量 def sayName():#使用了靜態(tài)方法,則不能再使用self print "my name is king"#,grade,#self.name @classmethod #類(lèi)方法 def classMethod(cls): print("class method") p = Person("king") p.sayHi() p.sayName() p.classMethod() Person.classMethod()
輸出:
Hello, your name is? king
my name is king
class method
class method
2、靜態(tài)方法
要在類(lèi)中使用靜態(tài)方法,需在類(lèi)成員函數(shù)前面加上@staticmethod標(biāo)記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實(shí)例即可使用這個(gè)方法。另外,多個(gè)實(shí)例共享此靜態(tài)方法。
靜態(tài)方法是一類(lèi)特殊的方法,有時(shí)可能需要寫(xiě)一個(gè)屬于這個(gè)類(lèi)的方法,但是這些代碼完全不會(huì)使用到實(shí)例對(duì)象本身,例如:
class Student(object): @staticmethod def aver_age(x, y): return x + y def year(self): return self.aver_age(self.month, self.day)
這個(gè)例子中,如果把a(bǔ)ver_age作為非靜態(tài)方法同樣可以運(yùn)行,但是它要提供self參數(shù),而這個(gè)參數(shù)在方法中根本不會(huì)被使用到。這里的@staticmethod裝飾器可以給我們帶來(lái)一些好處,Python不再需要為Student對(duì)象實(shí)例初始化一個(gè)綁定方法,綁定方法同樣是對(duì)象,但是創(chuàng)建需要成本,而靜態(tài)方法可以避免這些。
Student().year is Student().year Student().aver_age is Student().aver_age Student().aver_age is Student.aver_age False True True
可讀性更好的代碼,看到@staticmethod我們就知道這個(gè)方法并不需要依賴(lài)對(duì)象本身的狀態(tài)。
可以在子類(lèi)中被覆蓋,如果是把a(bǔ)ver_age作為模塊的頂層函數(shù),那么繼承自Student的子類(lèi)就沒(méi)法改變Student的aver_age了如果不覆蓋year的話。
3、 類(lèi)方法
類(lèi)方法與普通的成員函數(shù)和靜態(tài)函數(shù)有不同之處,在接觸的語(yǔ)言中好像也沒(méi)見(jiàn)過(guò)這種語(yǔ)義,看它的定義:
一個(gè)類(lèi)方法就可以通過(guò)類(lèi)或它的實(shí)例來(lái)調(diào)用的方法, 不管你是用類(lèi)來(lái)調(diào)用這個(gè)方法還是類(lèi)實(shí)例調(diào)用這個(gè)方法,該方法的第一個(gè)參數(shù)總是定義該方法的類(lèi)對(duì)象。
記住:方法的第一個(gè)參數(shù)都是類(lèi)對(duì)象而不是實(shí)例對(duì)象.
按照慣例,類(lèi)方法的第一個(gè)形參被命名為 cls.任何時(shí)候定義類(lèi)方法都不是必須的(類(lèi)方法能實(shí)現(xiàn)的功能都可以通過(guò)定義一個(gè)普通函數(shù)來(lái)實(shí)現(xiàn),只要這個(gè)函數(shù)接受一個(gè)類(lèi)對(duì)象做為參數(shù)就可以了).
class Dog(object): food = "gutou" age = "1" def __init__(self, name): self.NAME = name @classmethod def eat(self,age): #只能是類(lèi)中的變量 # print(self.NAME) print(age) print(self.food) @classmethod def eat1(self, age): # 只能是類(lèi)中的變量 # print(self.NAME) age = "2" self.food = "tang" @staticmethod def print_1(): print(Dog.food, Dog.age) d = Dog("labuladuo") d.eat(Dog.age) #通過(guò)對(duì)象調(diào)用 Dog.eat(Dog.age) #通過(guò)類(lèi)調(diào)用 print("-----1-----") d.eat1(Dog.age) Dog.print_1() print("--------2-------") Dog.eat1(Dog.age) Dog.print_1()
輸出:
1
gutou
1
gutou
-----1-----
('tang', '1')
--------2-------
('tang', '1')
以上就是解析python 類(lèi)方法、對(duì)象方法、靜態(tài)方法的詳細(xì)內(nèi)容,更多關(guān)于python 類(lèi)方法、對(duì)象方法、靜態(tài)方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python利用matplotlib生成圖片背景及圖例透明的效果
這篇文章主要給大家介紹了Python利用matplotlib生成圖片背景及圖例透明效果的相關(guān)資料,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考家價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-04-04Python實(shí)現(xiàn)的質(zhì)因式分解算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的質(zhì)因式分解算法,涉及Python數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-05-05Python3 獲取一大段文本之間兩個(gè)關(guān)鍵字之間的內(nèi)容方法
今天小編就為大家分享一篇Python3 獲取一大段文本之間兩個(gè)關(guān)鍵字之間的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10python實(shí)現(xiàn)庫(kù)存商品管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)庫(kù)存商品管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Python自動(dòng)化辦公之手機(jī)號(hào)提取
這篇文章主要介紹了如何利用Python語(yǔ)言編寫(xiě)一個(gè)手機(jī)號(hào)提取器,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2022-06-06在Keras中實(shí)現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu)
這篇文章主要介紹了在Keras中實(shí)現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06pyenv與virtualenv安裝實(shí)現(xiàn)python多版本多項(xiàng)目管理
這篇文章主要介紹了pyenv與virtualenv安裝實(shí)現(xiàn)python多版本多項(xiàng)目管理過(guò)程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08Python+django實(shí)現(xiàn)簡(jiǎn)單的文件上傳
這篇文章主要為大家詳細(xì)介紹了Python+django實(shí)現(xiàn)簡(jiǎn)單的文件上傳的相關(guān)代碼,感興趣的小伙伴們可以參考一下2016-08-08