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)
面向?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ù)
- 首先接觸任意一個(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ò)程
- 表明事物的特征,叫做屬性(變量)
- 表明事物功能或動(dòng)作,成為成員方法(函數(shù))
命名規(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()
- 就是在類(對(duì)象)中如果屬性有默認(rèn)值,那么在初次實(shí)列對(duì)象的時(shí)候。實(shí)列的屬性也具有默認(rèn)值,這個(gè)時(shí)候?qū)ο髮傩院蛯?shí)列屬性所指向的是同一片內(nèi)存空間
- 如果實(shí)列中屬性的值產(chǎn)生變換,那么屬性就將指向該實(shí)列自己的內(nèi)存空間中
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)