class 定義以下:
class ClassName(ParentClass): """class docstring""" def method(self): return
在python 中 定義類是經過class關鍵字,class後面接類名,類名一般是大寫開頭的單詞
括號中的ParentClass用來表示繼承的父類,若是沒有合適的繼承類,就是用object類,這是全部的類最終都會繼承的類
""""""中的內容表示docstring,能夠省省略
定義方法與函數定義十分相似,不過多了一個self參數表示這個對象自己
class Student(object): pass
定義好了student類,就能夠根據Student類建立出Student的實例,建立實例經過類名+'()'實現的:python
bart=Student() print bart # <__main__.Student object at 0x02497B90> print Student # <class '__main__.Student'>
能夠看到變量bart指向的就是一個Student的object,後面的0x02497B90是內存地址
能夠自由的給一個實例變量綁定屬性編程
bart.name='Bart Simpson' print bart.name # ==>>Bart Simpson
因爲類能夠起到模板的做用,所以在建立實例的時候,把一些咱們認爲必須綁定的屬性強制填寫進去
經過定義一個特殊的__init__方法,在建立實例的時候就把name,score等屬性綁定上去:函數
class Student(object): def __init__(self,name,score): self.name=name self.score=score
__init__方法的第一個參數永遠是self,表示建立的實例自己,所以,在__init__方法內部就能夠把各類屬性綁定到self,由於self就指向建立的實例自己。
有了__init__方法,在建立實例的時候,就不能傳入空的參數了,必須傳入與__init__方法匹配的參數,但self不須要傳,python解釋器本身會把實例變量傳進去: spa
bart=Student('Bart Simpson',59) print bart.name #==>Bart Simpson print bart.score #==>59
和普通的函數相比,在類中定義的函數只有一點不一樣,就是第一個參數永遠是實例變量self,而且調用時不用傳遞該參數,除此以外,類的方法和普通函數沒有什麼區別code
數據封裝
對象
面向對象編程的一個重要的特別就是數據封裝。在上面的student類中,每一個實例就擁有各自的name和score這些數據。咱們能夠經過函數來訪問這些數據
def print_score(std): print '%s:%s' %(std.name,std.score) print_score(bart)
# Bart Simpson:59
可是既然student實例自己就擁有這些數據,要訪問這些數據,就沒有必要從外面的函數去訪問,能夠直接在student類的內部定義訪問數據的函數,
這樣就把數據給封裝起來了,這些封裝數據的函數是和student類自己關聯起來的,咱們稱之爲類的方法
class Student(object): def __init__(self,name,score): self.name=name self.score=score def print_score(self): print '%s:%s' %(self.name,self.score)
要定義一個方法,除了第一個參數是self外,其餘和普通函數同樣。要調用一個方法只須要在實例變量上直接調用,除了self不用傳遞,其餘參數正常傳入:
bart.print_score() # Bart Simpson: 59
這樣一來,咱們從外部看Student類,就只須要知道,建立實例須要給出name和score,而如何打印,
都是在Student類的內部定義的,這些數據和邏輯被「封裝」起來了,調用很容易,但卻不用知道內部實現的細節。blog
封裝的另外一個好處是能夠給Student
類增長新的方法,好比get_grade:
繼承
class Student(object): ... def get_grade(self): if self.score >= 90: return 'A' elif self.score >= 60: return 'B' else: return 'C'