天天看點

python classmethod_Python 中的 classmethod 和 staticmethod 有什麼具體用途

展開全部

classmethod:類方法21135261

staticmethod:靜态方法

在python中,靜态方法和類方法都是可4102以通過類對象和類對象執行個體通路。但是差別是1653:

@classmethod 是一個函數修飾符,它表示接下來的是一個類方法,而對于平常我們見到的則叫做執行個體方法。 類方法的第一個參數cls,而執行個體方法的第一個參數是self,表示該類的一個執行個體。

普通對象方法至少需要一個self參數,代表類對象執行個體

類方法有類變量cls傳入,進而可以用cls做一些相關的處理。并且有子類繼承時,調用該類方法時,傳入的類變量cls是子類,而非父類。 對于類方法,可以通過類來調用,就像C.f(),有點類似C++中的靜态方法, 也可以通過類的一個執行個體來調用,就像C().f(),這裡C(),寫成這樣之後它就是類的一個執行個體了。

靜态方法則沒有,它基本上跟一個全局函數相同,一般來說用的很少

Example 1:>>> class a():

@staticmethod

def staticm():

print 'static'

def normalm(self):

print 'nomarl',self

@classmethod

def classm(cls):

print 'class',cls

>>> a1=a()

>>> a1.normalm()

nomarl <__main__.a instance at 0x84dddec>

>>> a1.staticm()

static

>>> a1.classm()

class __main__.a

>>> type(a)

>>> type(a1)

Example 2:class A(object):

@classmethod

def cm(cls):

print '類方法cm(cls)調用者:', cls.__name__

@staticmethod

def sm():

print '靜态方法sm()被調用'

class B(A):

pass

A.cm()

B.cm()

A.sm()

B.sm()

輸出:

類方法cm(cls)調用者: A

類方法cm(cls)調用者: B

靜态方法sm()被調用

靜态方法sm()被調用

@classmethod與@staticmethod的應用執行個體#!/usr/bin/env python

# -*- coding: utf-8 -*-

class TClassStatic(object):

obj_num = 0

def __init__(self, data):

self.data = data

TClassStatic.obj_num += 1

def printself(self):

print("self.data: ", self.data)

@staticmethod

def smethod():

print("the number of obj is : ", TClassStatic.obj_num)

@classmethod

def cmethod(cls):

print("cmethod : ", cls.obj_num)

cls.smethod()

def main():

objA = TClassStatic(10)

objB = TClassStatic(12)

objB.printself()

objA.smethod()

objB.cmethod()

print("------------------------------")

TClassStatic.smethod()

TClassStatic.cmethod()

if __name__ == "__main__":

main()123456789101112131415161718192021222324252627282930313233

輸出結果如下:('self.data: ', 12)

('the number of obj is : ', 2)

('cmethod : ', 2)

('the number of obj is : ', 2)

------------------------------

('the number of obj is : ', 2)

('cmethod : ', 2)

('the number of obj is : ', 2)