Python类方法、实例方法、静态方法和属性方法详解
靜態(tài)方法(可調(diào)類變量、可被實(shí)例調(diào)用、可被類調(diào)用)
1、用 @staticmethod 裝飾的不帶 self 參數(shù)的方法叫做靜態(tài)方法,類的靜態(tài)方法可以沒有參數(shù),可以直接使用類名調(diào)用
2、靜態(tài)方法名義上歸類管理,實(shí)際中在靜態(tài)方法中無法訪問類和實(shí)例中的任何屬性
3、調(diào)用時(shí)并不需要傳遞類或者實(shí)例。像我們?cè)陬愅舛x的函數(shù),只不過靜態(tài)方法可以通過類或者實(shí)例來調(diào)用而已
#實(shí)驗(yàn)證明eat靜態(tài)方法里不能傳self對(duì)象,因此無法調(diào)用實(shí)例變量import requests,json class Dog(object):food='牛肉'name='大黃狗'def __init__(self, name):self.name = name@staticmethoddef eat(self):print('%s eat %s' %(self.name,Dog.food)) d = Dog("拉布拉多") d.eat() Dog.eat()"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py Traceback (most recent call last):File "C:/Users/wangli/PycharmProjects/Test/Test/test.py", line 104, in <module>d.eat() TypeError: eat() missing 1 required positional argument: 'self'Process finished with exit code 1 #實(shí)驗(yàn)證明eat靜態(tài)方法,可由類和實(shí)例調(diào)用,可使用類變量class Dog(object):food='牛肉'name='大黃狗'def __init__(self, name):self.name = name@staticmethoddef eat(who):print('%s %s eat %s' %(who,Dog.name,Dog.food)) d = Dog("拉布拉多") d.eat('橙子家') Dog.eat('橘子家')"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 橙子家 大黃狗 eat 牛肉 橘子家 大黃狗 eat 牛肉Process finished with exit code 0類方法(可調(diào)類變量、可被實(shí)例調(diào)用、可被類調(diào)用)
1、類方法通過@classmethod裝飾器實(shí)現(xiàn),類方法和普通方法的區(qū)別是, 類方法只能訪問類變量,不能訪問實(shí)例變量
2、通過cls參數(shù)傳遞當(dāng)前類對(duì)象,不需要實(shí)例化,直接通過類對(duì)象【實(shí)例名.方法名】和類對(duì)象實(shí)例【類名.方法名】訪問
實(shí)驗(yàn)證明: 通過cls參數(shù)傳遞當(dāng)前類對(duì)象,不需要實(shí)例化,直接類名.方法名() 通過類對(duì)象和類對(duì)象實(shí)例訪問import requests,json class Dog(object):food='牛肉'name='大黃狗'def __init__(self, name):self.name = name@classmethoddef eat(cls,who):print('%s %s eat %s' %(who,cls.name,Dog.food)) d = Dog("大白狗") d.eat('橙子家') Dog.eat('橘子家')"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 橙子家 大黃狗 eat 牛肉 橘子家 大黃狗 eat 牛肉Process finished with exit code 0 實(shí)驗(yàn)證明: 類方法只能訪問類變量,不能訪問實(shí)例變量class Dog(object):food='牛肉'#name='大黃狗'def __init__(self, name):self.name = name@classmethoddef eat(self,who):print('%s %s eat %s' %(who,self.name,Dog.food)) d = Dog("大白狗") d.eat('橙子家') Dog.eat('橘子家')"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py Traceback (most recent call last):File "C:/Users/wangli/PycharmProjects/Test/Test/test.py", line 104, in <module>d.eat('橙子家')File "C:/Users/wangli/PycharmProjects/Test/Test/test.py", line 102, in eatprint('%s %s eat %s' %(who,self.name,Dog.food)) AttributeError: type object 'Dog' has no attribute 'name'Process finished with exit code 1類實(shí)例方法(可調(diào)類變量、可調(diào)實(shí)例變量、可被實(shí)例調(diào)用)
1、第一個(gè)參數(shù)強(qiáng)制為類實(shí)例對(duì)象self,可以通過這個(gè)類實(shí)例對(duì)象訪問類屬性self.name,可以通過類實(shí)例對(duì)象的__class__屬性訪問類屬性__class__.name。
2、類的初始化方法__init__也是實(shí)例方法,在實(shí)例創(chuàng)建的時(shí)候自動(dòng)調(diào)用
實(shí)驗(yàn)證明: 實(shí)例方法可調(diào)用類變量和實(shí)例變量class Dog(object):food='牛肉'name='大黃狗'def __init__(self, name):self.name = namedef eat(self,who): #實(shí)例方法print('%s %s eat %s' %(who,self.name,Dog.food)) d = Dog("大白狗") d.eat('橙子家')"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py 橙子家 大白狗 eat 牛肉Process finished with exit code 0屬性方法(可調(diào)類變量、可調(diào)實(shí)例變量、可被實(shí)例調(diào)用)
1、屬性方法,把一個(gè)方法變成靜態(tài)屬性,可以調(diào)類的實(shí)例變量和類變量
給 屬性方法賦值class Dog(object):def __init__(self, name):self.name = nameself.__food = None@propertydef eat(self):print('%s eat %s' %(self.name,self.__food))@eat.setterdef eat(self, food):self.__food = food d = Dog("labuladuo") d.eat d.eat = "baozi" d.eat"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py wang eat None wang eat baoziProcess finished with exit code 0 屬性方法應(yīng)用場(chǎng)景 比如 ,你想知道一個(gè)航班當(dāng)前的狀態(tài),是到達(dá)了、延遲了、取消了、還是已經(jīng)飛走了, 想知道這種狀態(tài)你必須經(jīng)歷以下幾步:1. 連接航空公司API查詢2. 對(duì)查詢結(jié)果進(jìn)行解析 3. 返回結(jié)果給你的用戶因此這個(gè)status屬性的值是一系列動(dòng)作后才得到的結(jié)果,所以你每次調(diào)用時(shí),其實(shí)它都要經(jīng)過一系列的動(dòng)作才返回你結(jié)果,但這些動(dòng)作過程不需要用戶關(guān)心, 用戶只需要調(diào)用這個(gè)屬性就可以import requests,json class Flight(object):def __init__(self,name):self.flight_name = namedef checking_status(self):print("checking flight %s status " % self.flight_name)return 1@propertydef flight_status(self):status = self.checking_status()if status == 0 :print("flight got canceled...")elif status == 1 :print("flight is arrived...")elif status == 2:print("flight has departured already...")else:print("cannot confirm the flight status...,please check later")@flight_status.setterdef flight_status(self,status):print('fight %s has changed status to %s'%(self.flight_name,status)) f = Flight("CA980") f.flight_status f.flight_status=2"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py checking flight CA980 status flight is arrived... fight CA980 has changed status to 2Process finished with exit code 0?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Python类方法、实例方法、静态方法和属性方法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php页面之间传值_php如何在不同页面
- 下一篇: Python测试开发django5.ur