『壹』 python裡面的靜態方法是不是不能遞歸

在類裡面定義的函數就是方法,類方法需要@ classmethod 修飾並且有個隱藏參數 cls,實例方法必須有個參數 self, 靜態方法必須有 @staticmethod修飾,類和實例都可以訪問靜態方法,實例可以訪問實例方法也可以訪問類方法
類可以訪問類方法也可以訪問實例方法,訪問實例方法必須要帶參數 self, 可以理解為類其實也是一個實例,類訪問實例方法不帶參數會報錯的.類本身可以訪問函數,實例卻不行.

『貳』 如何在Python中定義靜態變數

Python使用函數默認值實現函數靜態變數的方法,具體方法如下:
一、Python函數默認值

Python函數默認值的使用可以在函數調用時寫代碼提供方便,很多時候我們只要使用默認值就可以了。 所以函數默認值在python中用到的很多,尤其是在類中間,類的初始化函數中一幫都會用到默認值。 使用類時能夠方便的創建類,而不需要傳遞一堆參數。

只要在函數參數名後面加上 」=defalut_value」,函數默認值就定義好了。有一個地方需要注意的是,有默認值的參數必須在函數參數列表的最後,不允許將沒有默認值的參數放在有默認值的參數後,因為如果你那樣定義的話,解釋器將不知道如何去傳遞參數。

先來看一段示例代碼:

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

你調用上面的函數時,可以修改重試次數和輸出的提示語言,如果你比較懶得話,那麼什麼都不用改。

二、python使用函數默認值來實現函數靜態變數的功能

Python中是不支持靜態變數的,但是我們可以通過函數的默認值來實現靜態變數的功能。
當函數的默認值是內容是可變的類時,類的內容可變,而類的名字沒變。(相當於開辟的內存區域沒有變,而其中內容可以變化)。
這是因為python中函數的默認值只會被執行一次,(和靜態變數一樣,靜態變數初始化也是被執行一次。)這就是他們的共同點。

再來看下面的程序片段:

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'])」時,默認變數並沒有被改變,因為默認變數的初始化只是被執行了一次(第一次使用默認值調用),初始化執行開辟的內存區(我們可以稱之為默認變數)沒有被改變,所以最後的輸出結果是「[1, 2, 3, 5]」。

『叄』 python靜態方法和類方法的區別

classA:deffun_i(self,x):print(x)@classmethoddeffun_c(cls,x):print(x)@staticmethoddeffun_s(x):print(x)a=A()a.fun_i(1)a.fun_s(1)A.fun_c(1)A.fun_s(1)調用方式不同:類方法:應該通過類調用實例方法:應該通過實例調用靜態方法:既可以通過類調用,也可以通過實例調用實參和形參的定義和傳遞不同:靜態方法:聲明和調用時,都沒有隱含參數。實例方法:聲明時,要定義一個隱含參數:self。調用時,實例本身被隱含地傳遞給這個參數。類方法:聲明時,要定義一個隱含參數:cls。調用時,類本身被隱含地傳遞給這個參數。

『肆』 如何在Python中使用static,class,abstract方法

class 方法直接寫
static方法在方法前加上@staticmethod
abstract方法先從abc導入
from abc import abstractmethod
然後在方法前加上@abstractmethod

『伍』 python函數怎麼實現static變數


python函數實現static變數具體如下:

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



Python函數默認值的使用可以在函數調用時寫代碼提供方便,很多時候我們只要使用默認值就可以了。 所以函數默認值在python中用到的很多,尤其是在類中間,類的初始化函數中一幫都會用到默認值。 使用類時能夠方便的創建類,而不需要傳遞一堆參數。

只要在函數參數名後面加上 」=defalut_value」,函數默認值就定義好了。有一個地方需要注意的是,有默認值的參數必須在函數參數列表的最後,不允許將沒有默認值的參數放在有默認值的參數後,因為如果你那樣定義的話,解釋器將不知道如何去傳遞參數。

『陸』 python 函數中怎麼實現static 變數

Python使用函數默認值實現函數靜態變數的方法,具體方法如下:
一、Python函數默認值

Python函數默認值的使用可以在函數調用時寫代碼提供方便,很多時候我們只要使用默認值就可以了。 所以函數默認值在python中用到的很多,尤其是在類中間,類的初始化函數中一幫都會用到默認值。 使用類時能夠方便的創建類,而不需要傳遞一堆參數。

只要在函數參數名後面加上 」=defalut_value」,函數默認值就定義好了。有一個地方需要注意的是,有默認值的參數必須在函數參數列表的最後,不允許將沒有默認值的參數放在有默認值的參數後,因為如果你那樣定義的話,解釋器將不知道如何去傳遞參數。

先來看一段示例代碼:

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

你調用上面的函數時,可以修改重試次數和輸出的提示語言,如果你比較懶得話,那麼什麼都不用改。

二、python使用函數默認值來實現函數靜態變數的功能

Python中是不支持靜態變數的,但是我們可以通過函數的默認值來實現靜態變數的功能。
當函數的默認值是內容是可變的類時,類的內容可變,而類的名字沒變。(相當於開辟的內存區域沒有變,而其中內容可以變化)。
這是因為python中函數的默認值只會被執行一次,(和靜態變數一樣,靜態變數初始化也是被執行一次。)這就是他們的共同點。

再來看下面的程序片段:

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'])」時,默認變數並沒有被改變,因為默認變數的初始化只是被執行了一次(第一次使用默認值調用),初始化執行開辟的內存區(我們可以稱之為默認變數)沒有被改變,所以最後的輸出結果是「[1, 2, 3, 5]」。

『柒』 python 靜態方法可以訪問類方法嗎

Python的靜態方法和類成員方法都可以被類或實例訪問,兩者概念不容易理清,但還是有區別的:
1)靜態方法無需傳入self參數,類成員方法需傳入代表本類的cls參數;
2)從第1條,靜態方法是無法訪問實例變數的,而類成員方法也同樣無法訪問實例變數,但可以訪問類變數;
3)靜態方法有點像函數工具庫的作用,而類成員方法則更接近類似Java面向對象概念中的靜態方法。

實現靜態方法和類方法的兩種方式
一、在Python 2.3及之前,用staticmethod和classmethod類型對象包裝實現
例子如下(注意print里的說明):
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
def staticmd():
print '靜態方法,無法訪問val1和val2'
smd = staticmethod(staticmd)

def classmd(cls):
print '類方法,類:' + str(cls) + ',val1:' + cls.val1 + ',無法訪問val2的值'
cmd = classmethod(classmd)

執行:
>>> mc = MyClass()
>>> mc.smd()
>>> mc.cmd()
>>> MyClass.smd()
>>> MyClass.cmd()

二、在Python 2.4及之後,用裝飾器(decorators)實現
裝飾器使用@操作符,例子如下:
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'

@staticmethod
def staticmd():
print '靜態方法,無法訪問val1和val2'

@classmethod
def classmd(cls):
print '類方法,類:' + str(cls) + ',val1:' + cls.val1 + ',無法訪問val2的值'

『捌』 python在函數中有static變數嗎

沒有直接的static變數

用下面的方式模擬

defstatic_vars(**kwargs):
defdecorate(func):
forkinkwargs:
setattr(func,k,kwargs[k])
returnfunc
returndecorate

@static_vars(counter=0)
deffoo():
foo.counter+=1
print"Counteris%d"%foo.counter

『玖』 python 裡面有靜態函數嗎

python的類里用@staticmethod的是靜態方法,@classmethod的是類方法,如下

classPerson(object):

person_list=[]

def__init__(self,name,age):
self.name=name
self.age=age
self.person_list.append(self)

@classmethod
defone_year_later(cls):
forpincls.person_list:
p.age+=1

@staticmethod
defborn_one_boby(name):
returnPerson(name,0)

def__repr__(self):
return'<Personname:%s,age:%s>'%(self.name,self.age)

if__name__=='__main__':
petter=Person('Petter',23)
merry=Person('Merry',21)
print(petter)#<Personname:Petter,age:23>
print(merry)#<Personname:Merry,age:21>
Person.one_year_later()
print(petter)#<Personname:Petter,age:24>
print(merry)#<Personname:Merry,age:22>
baby=merry.born_one_boby('Tom')
print(Person.person_list)#[<Personname:Petter,age:24>,<Personname:Merry,age:22>,<Personname:Tom,age:0>]

『拾』 Python中靜態方法和類方法的區別

一、先是在語法上面的區別:
1、靜態方法不需要傳入self參數,類成員方法需要傳回入代表本答類的cls參數;
2、靜態方法是無妨訪問實例變數和類變數的,類成員方法無法訪問實例變數但是可以訪問類變數
二、使用的區別:
由於靜態方法無法訪問類屬性,實例屬性,相當於一個相對獨立的方法,跟類其實並沒有什麼關系。這樣說來,靜態方法就是在類的作用域里的函數而已。