Python面向對象編程--01 --(Python opp知識整理)

本知識點參考廖雪峯的Python課程 [https://www.liaoxuefeng.com]

感謝北京圖靈知非的免費課程 [http://www.tulingxueyuan.com/]

2018/6/25 星期一 9:56:21編程

Python面向對象編程--01

面向對象的概念

  • 面向對象編程——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

    • 面向對象是一種常見的思想,比方說數學公式就是衆多經驗統計出來的結果。比方說 動物、植物、都至關於類的概念
    • 在Python中,全部數據類型均可以視爲對象。
    • 咱們用 class建立類
    • init,至關於構造函數,就是函數必須輸入的值。

類和實例

  • 面向對象最重要的兩個概念就是 類(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類的定義看,外部代碼仍是能夠自由的修改實際的namescore屬性:

    >>> 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'
相關文章
相關標籤/搜索