2018/6/25 星期一 9:56:21編程
面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象做爲程序的基本單元,一個對象包含了數據和操做數據的函數。函數
在Python中,全部數據類型均可以視爲對象,固然也能夠自定義對象。自定義對象的數據類型就是面向對象中類(Class)的概念spa
假如咱們打印學生的成績表設計
面向過程會這樣實現,咱們程序的執行流程是:code
std1 ={'name':'yang','score':99} std2 = {'name':'wen','score':99} def print_score(std): print('{0}:{1}'.format(std['name'],std['score']))
若是採用面向對象的設計思想。Student應該是一個對象,這個對象擁有name和score這兩個屬性,若是打印出學生的成績,必須有student,而後才能把成績打印出來:orm
class Student(object): def __init__(self,name,score): self.name = name self.score = score def print_score(self): print('{0}:{1}'.format(self.name,self.score))
給對象發消息實際上就是調用對象的相關函數,咱們成爲對象的方法:對象
yang = Student('yangaoteng',100) wen = Student('wangwenwen',99) yang.print_score() wen.print_score()
小結:get
面向對象最重要的兩個概念就是 類(class)和 實例(Instance),類是抽象的模板(比如數學公式),而實例是根據類建立出來的’對象‘(比如用數學公式解出來的題)數學
還以上面的例子,在Python中,定義類經過class關鍵字:it
class Student(object): pass
class後面跟着的是類名,Student,類名大寫字符開頭,後面緊跟着(object),這表示這個類來自哪裏,括號裏面的object能夠不寫
定義好了Student類,能夠建立出Student的實例,建立實例經過類名+()現實:
yang = Student()
這時候能夠自由的給一個實例綁定屬性
yang.name = 'yangaoteng' yang.score = 1000
因爲類有的時候會起到模板的做用,咱們能夠在建立實例的時候,把咱們一些任務必須綁定的屬性填寫進去。咱們能夠經過一個特殊的 __ init _(先後個有兩個),在建立實例的時候,就能夠把 name , score 等屬性綁定上去:
class Student(): def __init__(self,name,score): self.name = name self.score = score
__ init __ 方法的第一個參數永遠是self,self表示建立的實例自己
有了__ init__ 方法,在建立實例的時候,就不能傳入空的函數了,必須傳入與__ init __ 方法匹配的參數,但self不須要傳,Python解釋器會自動上傳進去。
>>> yang = Student('yangaoteng',100) >>> yang.name ’yangaoteng‘ >>> yang.score 59
作到這裏咱們就能夠搞事情了,咱們能夠對數據進行分類,大於90分的成績爲’A‘....,進行男女的分類。等等,對數據進行處理
# 建立一個實例,對男女進行分類,對‘成績進行分類’ class Student(): def __init__(self,name,score,sex): self.name = name self.score = score self.sex = sex def Student_score(self): a='男' if self.sex =='男': a= '男' elif self.sex == '女': a= '女' if self.score >=80: print('姓名{0},性別{1},成績A'.format(self.name,a)) elif self.score >=60: print('姓名{0},性別{1},成績B'.format(self.name,a)) elif self.score >=0: print('姓名{0},性別{1},成績C'.format(self.name,a)) else: print('666')
在class內部,有屬性有方法有方法,外部代碼能夠直接調用實例變量的方法來進行操做,這樣,就隱藏了內部的複雜邏輯。
可是,從前面的Student類的定義看,外部代碼仍是能夠自由的修改實際的name
、score
屬性:
>>> yang = Student('yangaoteng',100,'男') >>> yang.score 100 >>> yang.score=0 >>> yang.score 0
這樣個人成績就被改變成了0分,顯然是不可能的。若是想讓內部屬性不被外部訪問,能夠在屬性名稱前面加上兩個下劃線 __
,在Python中,實例的變量若是以__
開頭,就是私有變量(private),只有內部能夠訪問,外部不能夠訪問。
class Student(object): def __init__(self,name,score): self.__name = name self.__score = score def print_score(self): print('{0}:{1}'.format(self.__name,self.__score))
改變完成以後,就沒法經過外部訪問了
>>> yang = Student('yangaoteng',100,'男') >>> yang._name Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute '__name
這樣參數被隱藏了,咱們沒法在內部進行訪問,咱們就能夠更好的處理數據。
# class Student(): def __init__(self, name, score): self.__name = name self.__score = score def get_name(self): return self.__name def get_score(self): return self.__score def set_name(self,name): self.__name = name def set_score(self,score): if 0<=score<=100: self.__score = score else: raise ValueError("數值不規範,請輸入(0-100)的數字") def print_score(self): print("{0}:{1}" % (self.__name, self.__score))
注意錯誤寫法:
>>> yang =Student('yangaoteng',100,'男') >>> yang.get_name() 'yangaoteng' >>> yang.__name = 'wangwenwen' >>> yang.__name wangwenwen
從表面看,外部代碼成功設置了__name
變量,但實際是這個__name
變量和class內部的__name
不是一個變量!
>>> yang.get_name() 'yangaoteng'