1. 程式人生 > >python-靜態成員函式和classmethod裝飾器

python-靜態成員函式和classmethod裝飾器

1. python類中定義的變數,如果不加self就不歸屬於類,只有在第一次例項化時進行初始化

class Count1:
    count = 0
    def __init__(self):
        Count1.count +=1
        self.num  = 1
        # count += 1 不允許  
    def get_count(self):
        return Count1.count

a1 = Count1()
a2 = Count1()
a2.num = 2

print("a1[%s:%s]a2[%s:%s]" % (a1.get_count(),a1.num,a2.get_count(),a2.num) )
print(Count1.get_count())

執行結果:

[email protected] ~/test_demo $ python classmethod2.py 
a1[2:1]a2[2:2]
Traceback (most recent call last):
  File "classmethod2.py", line 15, in <module>
    print(Count1.get_count())
TypeError: get_count() missing 1 required positional argument: 'self'

通過執行結果中num的的區別,可以看出Count1物件確實生成了兩個例項,而兩個例項中count都等於2,可見當a2在構造過程中並沒有初始化count變數到0,所以在類中直接定義的變數可認為靜態變數。

並且count在類中進行呼叫時候不允許在成員函式中直接使用,比如第六行會被識別為未定義。因此這種變數不屬於單個例項。

2. classmethod

 相對與上邊的程式碼就多了一行@classmethod來修飾get_count()

class Count1:
    count = 0
    def __init__(self):
        Count1.count +=1
        self.num  = 1
        # count += 1 不允許  
    @classmethod
    def get_count(self):
        return Count1.count

a1 = Count1()
a2 = Count1()
a2.num = 2

print("a1[%s:%s]a2[%s:%s]" % (a1.get_count(),a1.num,a2.get_count(),a2.num) )
print(Count1.get_count())

檢視執行結果:

[email protected] ~/test_demo $ python classmethod2.py 
a1[2:1]a2[2:2]
2

現在可以看到直接用Count1這個類名就可以呼叫到get_count函式,也就是說get_count函式此時不歸屬於a1,a2例項,因此可以說加上classmethod修飾後的函式,變成了靜態成員函式。

總結:

class裡直接定義且不帶self的變數是靜態成員變數,只在第一次例項化該類時被初始化。加上classmethod修飾的成員函式會成為靜態成員函式,不再歸屬於例項。

相關推薦

python-靜態成員函式classmethod裝飾

1. python類中定義的變數,如果不加self就不歸屬於類,只有在第一次例項化時進行初始化 class Count1: count = 0 def __init__(self): Count1.count +=1 self

類--面向對象 --statismethodclassmethod裝飾的用法

color 調用 不同的 需要 spa 括號 style 自動 blog 1)classmethod class Classmethod_demo:   def class Classmethod: #定義類名 role=‘dog‘ @clas

Python進階----*args**kwargs,裝飾的用法

pop reference value -- margin zoj 是什麽 ec2 多線程 關於多線程的一個問題 svn提交代碼的時間是什麽時候? 大家都開始C++0x了,我也來湊熱鬧,今天的主題是《調侃rvalue-reference》 新手c語言,求助break問

python小知識-__call__裝飾的結合使用

python get 都沒有 IV ini ble 自定義 裝飾器 介紹 class Decorator(): def __init__(self, f): print(‘run in init......‘) self.f = f

Python 中 property() 函式及 @property 裝飾的使用

Python 中 property() 函式及 @property 裝飾器的使用 文章目錄 Python 中 property() 函式及 @property 裝飾器的使用 0. 參考資料 1. property 應用場景 2.

手動實現staticmethodclassmethod裝飾

首先,staticmethod和classmethod裝飾器是通過非資料描述符實現的。用法簡單,這裡就不細說了。 這裡主要分析一下staticmethod和classmethod是如何通過描述符實現的。 from functools import partial class StaticMethod:

靜態成員函式static的作用及用法

類裡面的靜態成員函式相當於類裡面的全域性函式,它能訪問類裡面的私有建構函式、解構函式、普通函式以及成員變數,靜態成員只能通過靜態成員函式進行訪問。 靜態私有成員在類外不能被訪問,可通過類的靜態成員函式來訪問; 當類的建構函式是私有的時,不像普通類那樣例項化自己,只能通過靜態

靜態成員函式普通成員函式的區別

程式最終都將在記憶體中執行,變數只有在記憶體中佔有一席之地時才能被訪問。類的靜態成員(變數和方法)屬於類本身,在類載入的時候就會分配記憶體,可以通過類名直接去訪問;非靜態成員(變數和方法)屬於類的物件,所以只有在類的物件產生(建立類的例項)時才會分配記憶體,然後通過類的物件(例項)去訪問。在一個類的靜態成員中

Python知識點:理解使用裝飾 @decorator

開發十年,就只剩下這套架構體系了! >>>   

python :閉包,匿名函式,decorater裝飾

#python閉包 封裝 提高程式碼複用 內層函式引用外層函式的變數,返回內層函式 返回函式不可以為迴圈變數 示例1: #標準線不同時,判斷學生的成績是否通過 方法1: def pass_60(val) : #標準線為60時,判斷是否通過 pas

Python 中的 @staticmethod@classmethod(關鍵詞:Python/靜態方法/類方法/@staticmethod/@classmethod

結合書籍,我的理解 靜態方法: 出現在類中,第 1 個引數不是例項、也不是類, 由 @staticmethod 裝飾的方法; 類方法: 出現在類中,第 1 個引數不是例項、而是類, 由 @classmethod 裝飾的方法。 class C: @staticmetho

python學習筆記3 函式 閉包 裝飾

函式 def foo3():#函式名與引數 #函式體 cumsum=0 for i in range(15): cumsum+=i #return返回的是物件,(如返回物件數>1返回元組) retu

C++---類的靜態成員變數靜態成員函式

class Person { public : Person() { } static int m_Age ; //加入static 就是靜態成員變數,會共享資料; //靜態成員變數,在類內宣告,類外進行初始化; } int Person.m_Age = 0; //類外初始化

C++中靜態成員變數靜態成員函式的用法

昨天在修改專案函式功能時,在其中一個類中添加了一個靜態成員變數和兩個靜態成員函式,結果在連結時出現一個非常典型的錯誤:“The following symbols referenced in processor “p0” could not be resolve

python :閉包,匿名函式,decorater裝飾以及偏函式

#python閉包 封裝 提高程式碼複用 內層函式引用外層函式的變數,返回內層函式 返回函式不可以為迴圈變數 示例1: #標準線不同時,判斷學生的成績是否通過 方法1: def pass_60(val) : #標準線為60時,判斷是否通過 passli

類的靜態資料成員類的靜態成員函式

class Point { public: Point (int xx=0,int yy=0){X=xx;Y=yy;CountP++}; Point (Point &p); int GetX(){return X;} int GetY(){return Y;} static void Ge

靜態成員靜態成員函式的總結

一、靜態成員的特點: (1)static資料成員在類的內部宣告,但只能在類的外部定義,在類的外部不能指定static,在類的定義時候進行初始化; (2)static資料成員只能在類的外部進行初始化(特例:當整型const static資料成員被常量表達式初始化時,就可以在類的內部進行初始化,

靜態成員函式、this指標、物件指標動態物件使用小結

·靜態成員函式就是使用static 關鍵字宣告的成員函式  在類外實現時不加static關鍵字,只有在類內宣告時才加static·靜態成員函式是類的一部分,作用是為了處理靜態資料成員  沒有this指標·靜態成員函式可以直接訪問該類的靜態成員,但不能直接訪問類中的非靜態成員·若想在靜態成員fun中使用非靜態成

關鍵字static的作用是什麼? C++類中的靜態成員變數靜態成員函式的作用

關鍵字static的作用是什麼? 本題目轉自《面試寶典》 1,函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體 只被分配一次,因此其值在下次呼叫時,仍維持上次的值; 2,在模組內的static全域性變數可以被模組內所有的函式訪問,但不能被模

c++ 靜態資料成員靜態成員函式

       溫故而知新,閒來無事,再次捧了本c++primer 看了看,寫點c++靜態成員變數和成員函式吧,以前一直在用,但是有沒有完全搞懂什麼時候該用static 成員變數,什麼時候該用static function,什麼時候不要用靜態成員函式。        靜態成員變