回覆列表
-
1 # Tiekt鐵鐵
-
2 # 使用者5080196806422
1.類似靜態類的使用方法是對的。classmethod呼叫前必須加上class名字,這樣更有面向物件思想。
2.彌補了python不支援建構函式過載的不足,如果想從某種程度上實現建構函式過載,可以使用classmethod方法。這樣直接呼叫這個方法,可以完成建構函式的的工作。
1.類似靜態類的使用方法是對的。classmethod呼叫前必須加上class名字,這樣更有面向物件思想。
2.彌補了python不支援建構函式過載的不足,如果想從某種程度上實現建構函式過載,可以使用classmethod方法。這樣直接呼叫這個方法,可以完成建構函式的的工作。
classmethod:類方法staticmethod:靜態方法在python中,靜態方法和類方法都是可以透過類物件和類物件例項訪問。但是區別是:@classmethod 是一個函式修飾符,它表示接下來的是一個類方法,而對於平常我們見到的則叫做例項方法。 類方法的第一個引數cls,而例項方法的第一個引數是self,表示該類的一個例項。 普通物件方法至少需要一個self引數,代表類物件例項類方法有類變數cls傳入,從而可以用cls做一些相關的處理。並且有子類繼承時,呼叫該類方法時,傳入的類變數cls是子類,而非父類。 對於類方法,可以透過類來呼叫,就像C.f(),有點類似C++中的靜態方法, 也可以透過類的一個例項來呼叫,就像C().f(),這裡C(),寫成這樣之後它就是類的一個例項了。 靜態方法則沒有,它基本上跟一個全域性函式相同,一般來說用的很少Example 1:
>>> class a():@staticmethoddef staticm():print "static"def normalm(self):print "nomarl",self@classmethoddef 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 "classobj">>>> type(a1)<type "instance">
Example 2:class A(object):@classmethoddef cm(cls):print "類方法cm(cls)呼叫者:", cls.__name__@staticmethoddef sm():print "靜態方法sm()被呼叫"class B(A):passA.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)