以下面的類定義為例:
# coding:utf-8
class A:
count = 0
def __init__(self, inst_name):
self.inst_name = inst_name
self.__class__.count += 1
def inst_method(self):
print '實例(%s):%s' % (self.__class__.count, self.inst_name)
@classmethod
def class_method(cls):
print cls.count
@staticmethod
def static_method():
print 'hello'
a1,a2,a3,a4 = A('a1'),A('a2'),A('a3'),A('a4')
a1.inst_method()
a1.class_method() # 或 A.class_method()
a1.static_method() # 或 A.static_method()
類實例方法:第一個參數強制為類實例對象,可以通過這個類實例對象訪問類屬性,可以通過類實例對象的__class__
屬性訪問類屬性。
def inst_method(self):
print '實例(%s):%s' % (self.__class__.count, self.inst_name)
類實例方法不需要標注,第一個參數必不可少,解析器自動會將類實例對象傳給方法的第一個參數。
類的初始化方法__init__
也是實例方法,在實例創建的時候自動調用。在這里每當初始化一個實例,就通過__class__
來訪問類屬性count,是它加一,用來統計類的實例數。
def __init__(self, inst_name):
self.inst_name = inst_name
self.__class__.count += 1
類方法:第一個參數強制為類對象,可以通過這個類對象訪問類屬性,由於沒有傳入類實例對象,所以不能訪問類實例屬性。
@classmethod
def class_method(cls):
print cls.count
類方法需要使用classmethod
標注,第一個參數必不可少,解析器自動會將類對象傳給方法的第一個參數。
類靜態方法:無法訪問類屬性、類實例屬性、沒有默認的第一個參數,其實跟類沒什么關系,只是綁定在類命名空間下的函數而已。
@staticmethod
def static_method():
print 'hello'
類靜態方法通常用來定義一些和類主題相關的函數。
通過類對象可以調用類方法、類靜態方法,但不可以調用類實例方法;通過類實例對象可以調用以上三種方法
a1,a2,a3,a4 = A('a1'),A('a2'),A('a3'),A('a4')
a1.inst_method()
a1.class_method() # 或 A.class_method()
a1.static_method() # 或 A.static_method()