解析python 類方法、對(duì)象方法、靜態(tài)方法
python中實(shí)現(xiàn)靜態(tài)方法和類方法都是依賴于python的修飾器來實(shí)現(xiàn)的。 對(duì)象方法有self參數(shù),類方法有cls參數(shù),靜態(tài)方法是不需要這些附加參數(shù)的。
1、我們已經(jīng)討論了類/對(duì)象可以擁有像函數(shù)一樣的方法,這些對(duì)象方法與函數(shù)的區(qū)別只是一個(gè)額外的self變量
# -*- coding:utf-8 -*-#!/usr/bin/python# Filename: method.pyclass Person:grade=1def __init__(self,name):self.name = namedef sayHi(self):#加self區(qū)別于普通函數(shù)print ’Hello, your name is?’,self.name@staticmethod #聲明靜態(tài),去掉則編譯報(bào)錯(cuò);還有靜態(tài)方法不能訪問類變量和實(shí)例變量def sayName():#使用了靜態(tài)方法,則不能再使用selfprint 'my name is king'#,grade,#self.name@classmethod #類方法def classMethod(cls):print('class method')p = Person('king')p.sayHi()p.sayName()p.classMethod()Person.classMethod()
輸出:
Hello, your name is? kingmy name is kingclass methodclass method
2、靜態(tài)方法
要在類中使用靜態(tài)方法,需在類成員函數(shù)前面加上@staticmethod標(biāo)記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實(shí)例即可使用這個(gè)方法。另外,多個(gè)實(shí)例共享此靜態(tài)方法。
靜態(tài)方法是一類特殊的方法,有時(shí)可能需要寫一個(gè)屬于這個(gè)類的方法,但是這些代碼完全不會(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裝飾器可以給我們帶來一些好處,Python不再需要為Student對(duì)象實(shí)例初始化一個(gè)綁定方法,綁定方法同樣是對(duì)象,但是創(chuàng)建需要成本,而靜態(tài)方法可以避免這些。
Student().year is Student().yearStudent().aver_age is Student().aver_ageStudent().aver_age is Student.aver_ageFalseTrueTrue
可讀性更好的代碼,看到@staticmethod我們就知道這個(gè)方法并不需要依賴對(duì)象本身的狀態(tài)??梢栽谧宇愔斜桓采w,如果是把a(bǔ)ver_age作為模塊的頂層函數(shù),那么繼承自Student的子類就沒法改變Student的aver_age了如果不覆蓋year的話。
3、 類方法
類方法與普通的成員函數(shù)和靜態(tài)函數(shù)有不同之處,在接觸的語(yǔ)言中好像也沒見過這種語(yǔ)義,看它的定義:
一個(gè)類方法就可以通過類或它的實(shí)例來調(diào)用的方法, 不管你是用類來調(diào)用這個(gè)方法還是類實(shí)例調(diào)用這個(gè)方法,該方法的第一個(gè)參數(shù)總是定義該方法的類對(duì)象。
記住:方法的第一個(gè)參數(shù)都是類對(duì)象而不是實(shí)例對(duì)象. 按照慣例,類方法的第一個(gè)形參被命名為 cls.任何時(shí)候定義類方法都不是必須的(類方法能實(shí)現(xiàn)的功能都可以通過定義一個(gè)普通函數(shù)來實(shí)現(xiàn),只要這個(gè)函數(shù)接受一個(gè)類對(duì)象做為參數(shù)就可以了).
class Dog(object): food = 'gutou' age = '1' def __init__(self, name): self.NAME = name @classmethod def eat(self,age): #只能是類中的變量 # print(self.NAME) print(age) print(self.food) @classmethod def eat1(self, age): # 只能是類中的變量 # print(self.NAME) age = '2' self.food = 'tang' @staticmethod def print_1(): print(Dog.food, Dog.age)d = Dog('labuladuo')d.eat(Dog.age) #通過對(duì)象調(diào)用Dog.eat(Dog.age) #通過類調(diào)用print('-----1-----')d.eat1(Dog.age)Dog.print_1()print('--------2-------')Dog.eat1(Dog.age)Dog.print_1()
輸出:
1gutou1gutou-----1-----(’tang’, ’1’)--------2-------(’tang’, ’1’)
以上就是解析python 類方法、對(duì)象方法、靜態(tài)方法的詳細(xì)內(nèi)容,更多關(guān)于python 類方法、對(duì)象方法、靜態(tài)方法的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. html5手機(jī)觸屏touch事件介紹2. jsp實(shí)現(xiàn)簡(jiǎn)單用戶7天內(nèi)免登錄3. JSP動(dòng)態(tài)實(shí)現(xiàn)web網(wǎng)頁(yè)登陸和注冊(cè)功能4. HTML基礎(chǔ)知識(shí)總結(jié)5. 怎樣打開XML文件?xml文件如何打開?6. 讓 Asp 與 XML 交互7. ASP基礎(chǔ)入門第二篇(ASP基礎(chǔ)知識(shí))8. xml文件的結(jié)構(gòu)解讀第1/2頁(yè)9. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)10. 如何學(xué)習(xí)html的各種標(biāo)簽
