class MyClass:
pi = 3.14 # 因為pi前沒有self所以pi屬于MyClass這個類拱绑,因此也屬于該類將來創(chuàng)建的實例。對于實例而言它就叫做self.pi,而對于類而言它就叫做MyClass.pi。
def __init__(self,value=42):
self.tmp = value #因為tmp前面加上了self,所以這里的self.tmp不屬于類(即不存在MyClass.tmp)而是屬于該類創(chuàng)建的實例,因為帶self的是實例的屬性乓梨,不是類的屬性,帶self的只存在于實例中。
>>> f = MyClass() #創(chuàng)建實例
>>> f.tmp #tmp是在類中帶上了self所以tmp是實例屬性傲醉,f就是實例。
42
>>> MyClass.tmp #tmp不是類屬性呻率,所以這個將會失敗
Traceback (most recent call last):
......
>>> MyClass.pi #pi是類屬性
3.14
>>> f.pi #pi前沒有self硬毕,所以pi既是類屬性也是由類創(chuàng)建出來的實例屬性。
3.14
9.5.1 函數property的理解
class Rectangle:
def __init__ (self):
self.width = 0
self.height = 0
self.area = 0
def set_size(self, size):
self.width, self.height = size #將高和寬都稱為size礼仗,這樣管理起來比較方便
self.area = self.width * self.height = size
def get_size(self):
return self.width, self.height
size = property(get_size,set_size) #獲取方法在前吐咳,設置方法在后逻悠。這里其實產生的是self.size,這里省略了self
rect = Rectangle()
print (rect.get_size())
rect.size = 10,5 #將寬高理解成一組東西韭脊,叫做size童谒,對size這一個屬性進行更改,就相當于更改了兩個屬性沪羔。size是類(Rectangle())中一個實例(rect)的屬性饥伊。可以直接在外面進行賦值操作任内。執(zhí)行賦值語句的時候會調用set_size的方法撵渡,將10和5作為參數,傳遞進去死嗦。
print (rect.get_size())
print (rect.size)
#有一些屬性趋距,然后定義一個設置這些屬性的方法(給它們取一個名字,這里是size)越除,再定義一個獲取這些屬性的方法节腐,然后給
還可以計算面積
9.5.2 靜態(tài)方法和類方法
#一般的對象方法在沒有創(chuàng)建實例的時候沒法調用
class MyClass:
def foo(self):
print ('hi')
MyClass.foo() #沒有創(chuàng)建實例,無法調用方法
tmp = MyClass() #創(chuàng)建實例tmp
tmp.foo() #通過實例調用方法
#不創(chuàng)建實例有三種策略可使函數在外部被調用摘盆;
#其實也可以
#策略一:
MyClass().foo()
#策略二:靜態(tài)方法
class MyClass:
def foo():
print ('hi')
foo = staticmethod(foo)
#策略三:類方法.
#類方法中要包含參數cls
class MyClass:
def foo(cls):
print ('hi')
foo = classmethod(foo)