Python靜態方法(staticmethod)和類方法(classmthod)區別
因為對方法和函式兩者概念有些混淆,所以研究了一下。後來順帶把靜態方法和類方法也摸索了一下,稍微有了一些感覺。
直接上程式碼:
# coding:utf-8
class Apple:
def fun1(self):
return 'normal'
@staticmethod
def fun2():
return 'staticmethod'
@classmethod
def fun3(cls):
return 'classmethod'
print Apple.fun1
print Apple.fun2
print Apple.fun3
print "-"*80
apple = Apple()
print apple.fun1
print apple.fun2
print apple.fun3
print "-"*80
apple1 = Apple()
print apple1.fun1
print apple1.fun2
print apple1.fun3
執行結果:
<unbound method Apple.fun1>
<function fun2 at 0x00000000022FC4A8>
<bound method classobj.fun3 of <class __main__.Apple at 0x0000000001E7C768>>
--------------------------------------------------------------------------------
<bound method Apple.fun1 of <__main__.Apple instance at 0x00000000022FAE08>>
<function fun2 at 0x00000000022FC4A8>
<bound method classobj.fun3 of <class __main__.Apple at 0x0000000001E7C768>>
--------------------------------------------------------------------------------
<bound method Apple.fun1 of <__main__.Apple instance at 0x00000000022FAE48>>
<function fun2 at 0x00000000022FC4A8>
<bound method classobj.fun3 of <class __main__.Apple at 0x0000000001E7C768>>
- 普通方法傳入的第一個引數必須是self(當然也可以不用self,官方要求儘量用self),self是指例項物件本身;
- 靜態方法無需傳參;
- 類方法傳入的第一個引數必須是class,是指類本身。
對比結果1,5,9行
fun1通過class呼叫時,它是未繫結的方法,而例項化apple和apple1之後,它屬於繫結的方法,且例項化後的apple和apple1記憶體地址不同,因為它們屬於不同的例項物件。
對比結果2,6,10行
靜態方法fun2通過class呼叫或者通過例項化後的物件呼叫,是沒有任何區別的,全部都是指向同一塊記憶體地址。可以簡單的理解成靜態方法與類或者例項沒有任何關係,一旦呼叫後,它的記憶體地址即確定。
對比結果3,7,11行
類方法fun3通過class呼叫或者通過例項化後的物件呼叫,是沒有任何區別的,全部都是指向同一塊記憶體地址。為什麼?因為例項化物件apple和apple1呼叫類方法fun3傳入的第一個引數是類本身Apple,也就是說apple.fun3 = apple1.fun3 = Apple.fun3。
區別總結:
- 靜態方法裝飾器下定義的方法屬於函式(function);
- 類方法裝飾器下定義的方法屬於方法(method);
- 靜態方法無需傳入任何引數;
- 類方法傳入的第一個引數必須是class本身cls;
- 靜態方法與類方法一旦被呼叫,記憶體地址即確定。通過類呼叫和通過例項化物件呼叫的結果完全一樣。
相關推薦
Python靜態方法(staticmethod)和類方法(classmthod)區別
因為對方法和函式兩者概念有些混淆,所以研究了一下。後來順帶把靜態方法和類方法也摸索了一下,稍微有了一些感覺。 直接上程式碼: # coding:utf-8 class Apple:
python中靜態方法(@staticmethod)和類方法(@classmethod)的區別
方法 屬性方法 參數 pre 如果 icm ssm 使用 類方法 一般來說,要使用某個類的方法,需要先實例化一個對象再調用方法。 而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。 這有利於組織代碼,把某些應該屬於某
python基礎----特性(property)、靜態方法(staticmethod)、類方法(classmethod)、__str__的用法
、特性(property) 1 什麼是特性property property是一種特殊的屬性,訪問它時會執行一段功能(函式
python學習日記(OOP——靜態方法和類方法)
classmethod 類方法在Python中使用比較少,類方法傳入的第一個引數為cls,是類本身。並且,類方法可以通過類直接呼叫,或通過例項直接呼叫。但無論哪種呼叫方式,最左側傳入的引數一定是類本身。 通常情況下,類方法使用@classmethod裝飾器來宣告 當這個方法的操作只涉及靜態屬性的時候 就
python中的面向物件(簡單類的建立以及內建方法,私有屬性和私有方法的使用)
一、什麼面向物件和麵向過程? 面向物件:--誰來做? 相比較函式,面向物件是更大的封裝,根據職責在一個物件中封裝多個方法 1.在完成某一個需求前,首先確定職責--要做的事(方法) 2.根據職責確定不同的物件,在物件內部封裝不同的方法(多個) 3.最後完成程式碼
python基礎2-靜態方法和類方法
變量 img 靜態 訪問 func title 改變 參數 code 1. 類方法 是類對象所擁有的方法,需要用修飾器@classmethod來標識其為類方法,對於類方法,第一個參數必須是類對象,一般以cls作為第一個參數(當然可以用其他名稱的變量作為其第一個參數,但是大部
C語言中存儲類別又分為四類:自動(auto)、靜態(static)、寄存器的(register)和外部的(extern)。
字符變量 修飾 例如 register ext 進行 適合 sta -- 除法運算中註意: 如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2;而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000。 取余運算中註意: 該運算只適
Python的靜態方法和類方法
cts -i ack diff 繼承 ssm from 靜態方法 print Python中使用@staticmethod這個裝飾器讓方法變為靜態方法 一:定義 @staticmethod: 首先它是一個裝飾器,被裝飾的方法不需要隱含的參數,對象和對象的實例都可以調用靜態方
Python面向對象之靜態方法和類方法
pac local 面向對象語言 borde border time cme def 靜態方法 常規的類定義中,所有函數都被假定在實例上操作,該實例總是作為第一個參數self傳遞。但還有可以定義兩種常見的方法。 靜態方法是一種普通函數,它不會對任何實例類型進行操作。使用@s
【轉】Python基礎-封裝與擴充套件、靜態方法和類方法
【轉】Python基礎-封裝與擴充套件、靜態方法和類方法 一、封裝與擴充套件 封裝在於明確區分內外,使得類實現者可以修改封裝內的東西而不影響外部呼叫者的程式碼;而外部使用者只知道一個介面(函式),只要介面(函式)名、引數不變,使用者的程式碼永遠無需改變。這就提供一個良好的合作基礎——或者說,只要介面這個基
Object類(重寫equals和toString方法)
/* Object類:為所有類的預設根類(基類) * 1.toString方法:輸出當前物件地址 * 如a=new(); * printf(a)與print(a.toString)相同 輸出地址。 * 注意:可對toString方法重寫,
靜態方法@staticmethod和類方法@classmethod的異同
我們都知道,普通的類方法需要經過例項化物件後,才能呼叫使用 而經過@staticmethod和@classmethod裝飾後的類方法這不需要例項化來呼叫,可以直接用類名來呼叫,類名.方法名(),但是也能夠例項化後呼叫 這有利於組織程式碼,把某些應該屬於某個類的函
2018年11月13日Java學習之關鍵字static(類成員和類方法),單例設計,類的成員之:初始化塊
1.類變數(類屬性)由該類的所有例項共享 static 修飾的變數就是類變數,可以直接不建立物件訪問靜態成員,所有例項可以共同修改這個值 2.類方法 static修飾的方法可以用類名.方法名()訪問 在static方法內部只能訪問類的static屬性,不能訪問
靜態巢狀類(Static Nested Class)和內部類(Inner Class)
一. 什麼是巢狀類及內部類? 可以在一個類的內部定義另一個類, 這種類稱為巢狀類(nested classes),它有兩種型別: 靜態巢狀類和非靜態巢狀類.靜態巢狀類使用很少, 最重要的是非靜態巢狀類, 也即是被稱作為 內部類(inner).巢狀類從JDK1.1
Python基礎筆記_Day11_Python單繼承、多繼承、重寫方法、Python多型、Python靜態方法和類方法
Day11_Python單繼承、多繼承、重寫方法、Python多型、Python靜態方法和類方法 11.01_Python語言基礎(繼承的介紹)(掌握) 11.02_Python語言基礎(單繼承)(掌握) 11.03_Python語言基礎(多繼承)(掌握) 11.04_Python語言基
robotframework使用python自定義“關鍵字”的兩種方法:匯入庫(LIB)和匯入模組(py檔案)
1、匯入庫,需要把檔案做成包的形式 常見放置在,python主目錄的 \Lib\site-packages下 __init__.py 好處是:適合大規模的開發,包有多人負責,分模組開發,無限擴充套件檔案數量 缺點是:統一歸檔相對麻煩 2、匯入檔案,直
自學Python day6--------面向物件程式設計(例項屬性和類屬性)
因為Python是動態語言,可以根據例項任意繫結屬性,如: class Student(object): def __init__(self, name): self.name = name s = Student('Bob') s.
Python 靜態方法和類方法的區別
python staticmethod and classmethodThough classmethod and staticmethod are quite similar, there’s a slight difference in usage for both en
python 普通方法、靜態方法和類方法有什麼區別?
下面用例子的方式,說明其區別。 首先, 定義一個類,包括3個方法: class Apple(object): def get_apple(self, n): print "apple: %s,%s" % (
Python 靜態方法和類方法
靜態方法 我們知道在其他語言中靜態方法一般使用static修飾,靜態方法的主要特點是不需要new出物件,直接通過類名就可以訪問,也可以通過物件訪問。需要使用staticmethod裝飾器裝飾方法 舉例: class A: @staticmethod