python的類里用@staticmethod的是靜態(tài)方法,@classmethod的是類方法,如下
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都做網(wǎng)站、網(wǎng)站設計、江蘇網(wǎng)絡推廣、成都小程序開發(fā)、江蘇網(wǎng)絡營銷、江蘇企業(yè)策劃、江蘇品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學生創(chuàng)業(yè)者提供江蘇建站搭建服務,24小時服務熱線:028-86922220,官方網(wǎng)址:jinyejixie.com
class?Person(object):
person_list?=?[]
def?__init__(self,?name,?age):
self.name?=?name
self.age?=?age
self.person_list.append(self)
@classmethod
def?one_year_later(cls):
for?p?in?cls.person_list:
p.age?+=?1
@staticmethod
def?born_one_boby(name):
return?Person(name,?0)
def?__repr__(self):
return?'Person?name:%s,?age:%s'?%?(self.name,?self.age)
if?__name__?==?'__main__':
petter?=??Person('Petter',23)
merry?=?Person('Merry',21)
print(petter)?#?Person?name:Petter,?age:23
print(merry)??#??Person?name:Merry,?age:21
Person.one_year_later()
print(petter)??#??Person?name:Petter,?age:24
print(merry)??#??Person?name:Merry,?age:22
baby?=?merry.born_one_boby('Tom')
print(Person.person_list)?#??[Person?name:Petter,?age:24,?Person?name:Merry,?age:22,?Person?name:Tom,?age:0]
一、先是在語法上面的區(qū)別:
1、靜態(tài)方法不需要傳入self參數(shù),類成員方法需要傳入代表本類的cls參數(shù);
2、靜態(tài)方法是無妨訪問實例變量和類變量的,類成員方法無法訪問實例變量但是可以訪問類變量
二、使用的區(qū)別:
由于靜態(tài)方法無法訪問類屬性,實例屬性,相當于一個相對獨立的方法,跟類其實并沒有什么關系。這樣說來,靜態(tài)方法就是在類的作用域里的函數(shù)而已。
Python使用靜態(tài)方法類似函數(shù)工具使用,一般盡量少用靜態(tài)方法。
Python的靜態(tài)方法和類成員方法都可以被類或實例訪問,兩者概念不容易理清,但還是有區(qū)別的:
1)靜態(tài)方法無需傳入self參數(shù),類成員方法需傳入代表本類的cls參數(shù);
2)從第1條,靜態(tài)方法是無法訪問實例變量的,而類成員方法也同樣無法訪問實例變量,但可以訪問類變量;
3)靜態(tài)方法有點像函數(shù)工具庫的作用,而類成員方法則更接近類似Java面向對象概念中的靜態(tài)方法。
在類里面定義的函數(shù)就是方法,類方法需要@ classmethod 修飾并且有個隱藏參數(shù) cls,實例方法必須有個參數(shù) self, 靜態(tài)方法必須有 @staticmethod修飾,類和實例都可以訪問靜態(tài)方法,實例可以訪問實例方法也可以訪問類方法
類可以訪問類方法也可以訪問實例方法,訪問實例方法必須要帶參數(shù) self, 可以理解為類其實也是一個實例,類訪問實例方法不帶參數(shù)會報錯的.類本身可以訪問函數(shù),實例卻不行.
Python使用函數(shù)默認值實現(xiàn)函數(shù)靜態(tài)變量的方法,具體方法如下:
一、Python函數(shù)默認值
Python函數(shù)默認值的使用可以在函數(shù)調用時寫代碼提供方便,很多時候我們只要使用默認值就可以了。 所以函數(shù)默認值在python中用到的很多,尤其是在類中間,類的初始化函數(shù)中一幫都會用到默認值。 使用類時能夠方便的創(chuàng)建類,而不需要傳遞一堆參數(shù)。
只要在函數(shù)參數(shù)名后面加上 ”=defalut_value”,函數(shù)默認值就定義好了。有一個地方需要注意的是,有默認值的參數(shù)必須在函數(shù)參數(shù)列表的最后,不允許將沒有默認值的參數(shù)放在有默認值的參數(shù)后,因為如果你那樣定義的話,解釋器將不知道如何去傳遞參數(shù)。
先來看一段示例代碼:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = raw_input(prompt)
if ok in ('y', 'ye', 'yes'): return True
if ok in ('n', 'no', 'nop', 'nope'): return False
retries = retries - 1
if retries 0: raise IOError, 'refusenik user'
print complaint
你調用上面的函數(shù)時,可以修改重試次數(shù)和輸出的提示語言,如果你比較懶得話,那么什么都不用改。
二、python使用函數(shù)默認值來實現(xiàn)函數(shù)靜態(tài)變量的功能
Python中是不支持靜態(tài)變量的,但是我們可以通過函數(shù)的默認值來實現(xiàn)靜態(tài)變量的功能。
當函數(shù)的默認值是內容是可變的類時,類的內容可變,而類的名字沒變。(相當于開辟的內存區(qū)域沒有變,而其中內容可以變化)。
這是因為python中函數(shù)的默認值只會被執(zhí)行一次,(和靜態(tài)變量一樣,靜態(tài)變量初始化也是被執(zhí)行一次。)這就是他們的共同點。
再來看下面的程序片段:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
print f(4,['x'])
print f(5)
其輸出結果是:
[1]
[1, 2]
[1, 2, 3]
['x', 4]
[1, 2, 3, 5]
前面的好理解,為什么最后 “print f(5)”的輸出是 “[1, 2, 3, 5]”呢?
這是因為 “print f(4,['x'])”時,默認變量并沒有被改變,因為默認變量的初始化只是被執(zhí)行了一次(第一次使用默認值調用),初始化執(zhí)行開辟的內存區(qū)(我們可以稱之為默認變量)沒有被改變,所以最后的輸出結果是“[1, 2, 3, 5]”。
分享題目:python中的靜態(tài)函數(shù) python靜態(tài)屬性和靜態(tài)方法
文章網(wǎng)址:http://jinyejixie.com/article2/dossoic.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、搜索引擎優(yōu)化、小程序開發(fā)、網(wǎng)站導航、靜態(tài)網(wǎng)站、微信小程序
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)