Python-學(xué)習(xí)之路-08 OOP -01

OOP 面向?qū)ο?/h1>
  • 面向?qū)ο蟮奶匦?/p>

    • 封裝
      • 封裝就是對(duì)對(duì)象的成員進(jìn)行訪問(wèn)限制
      • 封裝的三個(gè)級(jí)別
        • 公開(kāi):public
        • 受保護(hù)的: protected
        • 私有的:private
        • public protected private 不是關(guān)鍵字
      • 判斷對(duì)象的位置
        • 對(duì)象內(nèi)部
        • 對(duì)象外部
        • 子類中
      • 私有:
        • 私有成員是最高級(jí)別的封裝,只能在當(dāng)前類或?qū)ο笾性L問(wèn)
        • 在成員變量前面加上兩個(gè)下劃線即可
        • Python的私有不是真私有,是一種成為name mangling的改名策略,可以使用_clasname__attributeName進(jìn)行訪問(wèn)
      • 受保護(hù)的封裝 protected
        • 受保護(hù)的封裝是將對(duì)象成員進(jìn)行一定級(jí)別的封裝,然后在類中或者子類中都可以進(jìn)行訪問(wèn),但是外部不可以
        • 封裝方法:在成員名稱前添加一個(gè)下劃線即可
      • 公開(kāi)的 共有的 public
        • 公共的封裝實(shí)際對(duì)成員沒(méi)有操作,沒(méi)有任何的訪問(wèn)限制
    class Person():
    #name是公有變量
    name = "liuyun"
    #age是私有變量
    __age = 18
    
    p = Person()
    print(p.name)
    print(p._Person__age)
    
    • 繼承
      • 繼承就是一個(gè)類可以獲得另一個(gè)類中成員屬性和成員方法
      • 作用:減少代碼,增加代碼的服用功能。同時(shí)可以設(shè)置類與類之間的關(guān)系
      • 繼承與被繼承的概念:
        • 被繼承的類叫父類,也叫基類,也叫超類
        • 用于繼承的類叫子類,也叫派生類
        • 繼承與被繼承一定存在一個(gè)is-A的關(guān)系
      • 繼承的特征
        • 所有的類都繼承自object類,即所有的類的父類都是object
        • 子類一旦繼承父類,則可以使用父類中除私有成員外的所有內(nèi)容
        • 子類繼承父類后并沒(méi)有將父類成員賦值到子類中,而是通過(guò)引用關(guān)系進(jìn)行調(diào)用
        • 子類中可以定義多有的成員屬性和方法
        • 子類中定義的成員和父類成員如果相同,則優(yōu)先使用子類成員
        • 子類如果想擴(kuò)充父類的方法,可以在定義新方法的同時(shí)訪問(wèn)父類成員來(lái)進(jìn)行代碼重用,可以使用 父類名.父類成員 的格式來(lái)調(diào)用父類成員,也可以使用super(),父類成員的格式來(lái)調(diào)用
      • 繼承變量函數(shù)的查找順序問(wèn)題
        • 優(yōu)先查找自己的變量
        • 沒(méi)有則查找父類
        • 構(gòu)造函數(shù)如果本類中沒(méi)有定義,則自動(dòng)查找父類的構(gòu)造函數(shù),如果本類中有,則不想上查找
      • 構(gòu)造函數(shù)
        • 是一類特殊的函數(shù),在類進(jìn)行實(shí)列化之前進(jìn)行調(diào)用
        • 如果定義了構(gòu)造函數(shù),則實(shí)列化時(shí)使用構(gòu)造函數(shù),不向上查找父類的構(gòu)造函數(shù)
        • 如果沒(méi)有定義,則向上查找父類的構(gòu)造函數(shù)
        • 如果子類沒(méi)有定義,父類的構(gòu)造函數(shù)帶有參數(shù),則構(gòu)造對(duì)象是參數(shù)應(yīng)該按父類的構(gòu)造函數(shù)的參數(shù)進(jìn)行傳值
      • super
        • super不是一個(gè)關(guān)鍵字,而是一個(gè)類
        • super 的作用是獲取MRO(MethodResolustionOrder)列表中的第一個(gè)類
        • super于父類直接沒(méi)任何實(shí)質(zhì)的關(guān)系,但通過(guò)super可以調(diào)用到父類
    #繼承語(yǔ)法
    # 在python中,任何一個(gè)類都有一個(gè)共同的父類叫object
    class Person():
        name = "NoName"
        age = 0
        _petname = "sec" # 小名 是保護(hù)的,子類可以用,但不能公開(kāi)
        __score = 0 #成績(jī) 私有的,只能自己使用
        def sleep(self):
            print("Slesping......")
        def work(self):
            print("make some money....")
    
    #父類寫在括號(hào)中
    class Teacher(Person):
        teacherId = "9527"
        name = "dana"
        #子類擴(kuò)充父類的功能,只需要調(diào)用父類的功能
        def work(self):
            # 方法一 Person.work(self)
            # 方法二
            super().work()
            print("attention")
        pass
    t = Teacher()
    print(t.work())
    print(t.name)
    print(t.age)
    print(t.sleep())
    
         # 構(gòu)造函數(shù)
     class Animal():
         pass
     
     class Mammal(Animal):
         #多個(gè)參數(shù)的構(gòu)造函數(shù)
         def __init__(self,type):
             print("i am mammal{0}".format(type))
     
     class Dog(Mammal):
         #__init__ 就是構(gòu)造函數(shù)
         # 在實(shí)列化的時(shí)候,第一個(gè)被自動(dòng)調(diào)用
         # 主要的工作是進(jìn)行初始化
         def __init__(self):
             print("i am init in dog")
     class Cat(Mammal):
         pass
     
     zongzi = Dog()
     
     tiger = Cat("cat")
    
  • 面向?qū)ο缶幊?/p>

    • 基礎(chǔ)
    • 公有私有
    • 繼承
    • 組合、Minxi
  • 魔法函數(shù)

    • 魔法函數(shù)概述
    • 構(gòu)造類魔法函數(shù)
    • 運(yùn)算類魔法函數(shù)

1. 面向?qū)ο蟾攀觯∣bjectOriented OO)

  • OOP思想
    • 首先接觸任意一個(gè)任務(wù),首先想到的是任務(wù)這個(gè)世界的構(gòu)成,是由一個(gè)一個(gè)的模型構(gòu)成的
  • 名詞解釋
    • OO:面向?qū)ο?/li>
    • OOA: 面向?qū)ο蟮姆治?/li>
    • OOD: 面向?qū)ο蟮脑O(shè)計(jì)
    • OOI: xxx的實(shí)現(xiàn)
    • OOP: xxx的編程
    • OOA-->OOD-->OOI:面向?qū)ο蟮膶?shí)現(xiàn)過(guò)程
  • 任何一個(gè)事物的名詞都具有屬性

2. 類和對(duì)象的概念

  • 類: 抽象名詞,代表一個(gè)集合,共性的事物
  • 對(duì)象:具象的事物,單個(gè)個(gè)體
  • 類與對(duì)象的關(guān)系
  • 一個(gè)具象,代表一類事物的某一個(gè)個(gè)體
  • 一個(gè)抽象,代表的是一大類事物
  • 類中的內(nèi)容,應(yīng)該具有兩個(gè)內(nèi)容
    • 表明事物的特征,叫做屬性(變量)
    • 表明事物功能或動(dòng)作,成為成員方法(函數(shù))

3.類的基本實(shí)現(xiàn)

  • 命名規(guī)則(遵循命名規(guī)則)

  • 聲明

    • 必須使用class關(guān)鍵字
    • 類由屬性和方法構(gòu)成,其他不允許出現(xiàn)(保存其純潔性)
    • 成員屬性定義可以直接使用變量賦值,如果沒(méi)有值,可以使用None
    • 案列 01.py
  • 實(shí)例化類

    變量 = 類名()

  • 訪問(wèn)成員屬性/方法

    • obj.成員屬性名稱
    • boj.成員方法
  • 可以通過(guò)默認(rèn)內(nèi)置變量檢查類和對(duì)象的所有成員

    • 對(duì)象所有成員檢查
    # dict 前后各有兩個(gè)下劃線
        boj.__dict__
    
    • 類所有成員
    # dict 前后各有兩個(gè)下劃線
        class_name.__dict__
    
# 定義一個(gè)學(xué)生類
class Student():
    # 定義一個(gè)類,pass標(biāo)識(shí)直接跳過(guò)
    pass
#定義一個(gè)對(duì)象
mingyue = Student()

class PythonStudent():
    name = None
    age = 19
    course = "Python"

    def doHomeWork(self):
        print("我在做作業(yè)!")
        # 建議所有的方法都提供返回值,哪怕沒(méi)有返回的值
        # 直接用return None
        return None

# 實(shí)列一個(gè)學(xué)生
yueyue = PythonStudent()
print(yueyue.name)
print(yueyue.age)
yueyue.doHomeWork()

為不影響環(huán)境的純潔性,使用anaconda進(jìn)行虛擬環(huán)境的管理

  • conda env list :虛擬環(huán)境列表
  • conda create -n xxx pythone=3.6 (創(chuàng)建一個(gè)python版本為3.6 名稱為xxx的虛擬環(huán)境)
  • source activate oop: (激活虛擬環(huán)境)
  • source deactivate:反激活(關(guān)閉)虛擬環(huán)境()在當(dāng)前虛擬環(huán)境下

4.類和對(duì)象的成員分析

  • 類和對(duì)象都可以存儲(chǔ)成員,成員可以歸類所有,也可以歸對(duì)象所有
  • 類存儲(chǔ)成員時(shí)使用的是與類關(guān)聯(lián)的一個(gè)對(duì)象
  • 對(duì)象存儲(chǔ)成員是存儲(chǔ)在當(dāng)前對(duì)象中
  • 創(chuàng)建對(duì)象的時(shí)候,類中的成員不對(duì)放入實(shí)列中去,而是得到一個(gè)空對(duì)象,沒(méi)有成員
  • 類實(shí)列屬性和對(duì)象的實(shí)列的屬性在不對(duì)其進(jìn)行賦值的時(shí)候,其指向的是同一塊內(nèi)存。如果實(shí)列的值進(jìn)行變化,那么他的值歸于該實(shí)列的獨(dú)立空間中
    • 就是在類(對(duì)象)中如果屬性有默認(rèn)值,那么在初次實(shí)列對(duì)象的時(shí)候。實(shí)列的屬性也具有默認(rèn)值,這個(gè)時(shí)候?qū)ο髮傩院蛯?shí)列屬性所指向的是同一片內(nèi)存空間
    • 如果實(shí)列中屬性的值產(chǎn)生變換,那么屬性就將指向該實(shí)列自己的內(nèi)存空間中

5.關(guān)于self

  • self:在對(duì)象的方法中標(biāo)識(shí)當(dāng)前對(duì)象本身,如果通過(guò)對(duì)象調(diào)用一個(gè)方法,那么該對(duì)象會(huì)自動(dòng)傳入到當(dāng)前方法的第一個(gè)參數(shù)中 相當(dāng)于java類中的this
  • self不是一個(gè)關(guān)鍵字,只是一個(gè)用于接收對(duì)象的普通參數(shù),理論上可以用任何一個(gè)普通變量名代替
  • 方法中的self形參的方法成為非綁定類的方法,可以通過(guò)對(duì)象方位,沒(méi)有self的是綁定類的方法,只能通過(guò)類訪問(wèn)
  • 使用類訪問(wèn)綁定類的方法時(shí),如果類方法中需要訪問(wèn)當(dāng)前類的成員,可以通過(guò)class成員名來(lái)訪問(wèn)
class A():
    name = "aaa"
    age = 0
    def __init__(self):
        name = "bbb"
        age = 19
    def say(self):
        print(self.name)
        print(self.age)
        
class B():
    name = "ccc"
    age = 11
    
a = A()
# 此時(shí),系統(tǒng)會(huì)默認(rèn)的把a(bǔ)最為一個(gè)參數(shù)傳入到self中
a.say()

# 鴨子模型
# 此時(shí),self被a替換,如果是類名來(lái)調(diào)用類中的函數(shù),那么就必須傳入一個(gè)和該對(duì)象有相同屬性的對(duì)象
A.say(a)
A.say(A)
A.say(B)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容