1. 程式人生 > >Python靜態方法(staticmethod)和類方法(classmthod)區別

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>>
  1. 普通方法傳入的第一個引數必須是self(當然也可以不用self,官方要求儘量用self),self是指例項物件本身;
  2. 靜態方法無需傳參;
  3. 類方法傳入的第一個引數必須是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。

區別總結:

  1. 靜態方法裝飾器下定義的方法屬於函式(function);
  2. 類方法裝飾器下定義的方法屬於方法(method);
  3. 靜態方法無需傳入任何引數;
  4. 類方法傳入的第一個引數必須是class本身cls;
  5. 靜態方法與類方法一旦被呼叫,記憶體地址即確定。通過類呼叫和通過例項化物件呼叫的結果完全一樣。

相關推薦

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重寫equalstoString方法

/*    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