一、面向?qū)ο笏枷?/p>
1.面向?qū)ο笏枷朐O(shè)計(jì)
基于哲學(xué)觀點(diǎn):萬物皆對(duì)象
舉例說明:
- 案例一:我想吃大盤雞
面向過程 面向?qū)ο?/p>
1.自己去買菜 1.委托一個(gè)人幫忙買菜
2.自己擇菜 2.委托一個(gè)人幫忙擇菜
3.自己做菜 3.委托一個(gè)人廚師做菜
4.自己吃 4.自己吃
- 案例二:小明是一個(gè)電腦小白,想要配置一臺(tái)電腦
面向過程 面向?qū)ο?/p>
1.小明補(bǔ)充電腦知識(shí) 1.委托一個(gè)懂電腦的人買零件
2.小明去買零件 2.委托一個(gè)人組裝
3.小明把零件運(yùn)回來 3.小明打開玩游戲
4.小明組裝
5.小明打開玩游戲
- 案例三:一輛紅色的法拉利在京藏高速上奔馳
法拉利 京藏高速
面向過程:狗吃屎 面向?qū)ο螅撼怨肥?/p>
面向過程:蛋炒飯 面向?qū)ο螅荷w澆飯
2.面向過程和面向?qū)ο蟮膮^(qū)別
2.1面向過程
process:處理
在生活案例中:
一種看待問題的思維方式,在解決問題的時(shí)候,側(cè)重于問題是怎樣一步一步解決的,然后親力親為的去解決
在程序中:
代碼從上往下依次執(zhí)行
各個(gè)模塊之間的關(guān)系盡可能的獨(dú)立的,當(dāng)import的時(shí)候,加載的順序也是從上往下依次加載
每個(gè)模塊中的語句結(jié)構(gòu):順序,分支,循環(huán)
2.2面向?qū)ο?/p>
在生活案例中:
一種看待問題的思維方式,側(cè)重于找到一個(gè)具有特殊功能的個(gè)體,然后委托這個(gè)個(gè)體幫忙完成某件事情,這個(gè)個(gè)體就被稱為對(duì)象
好處:可以將復(fù)雜的問題簡單化,將程序員從執(zhí)行者變成了指揮者
在程序中:
根據(jù)不同的需求執(zhí)行代碼【代碼執(zhí)行順序不一定】
程序的流程完全由需求決定【對(duì)象】
思想:如果對(duì)象存在,則直接使用;如果對(duì)象不存在,則創(chuàng)建對(duì)象
注意:面向?qū)ο笾皇且环N思想,并不是一門編程語言
Python是一門面向?qū)ο蟮木幊陶Z言,類和對(duì)象是 面向?qū)ο蟮暮诵?/p>
示例: 小狗吃食(聞一聞smell、舔一舔lick、咬一咬bite)
分別采用面向過程和面向?qū)ο髞矸治?
面向過程 : 先聞一聞, 然后再舔一舔, 最后再咬一咬 (注重過程)
面向?qū)ο?: 小狗是一個(gè)對(duì)象, 它可以聞一聞食物, 可以舔一舔食物, 可以咬一咬食物. (不注重過程, 注重對(duì)象)
二、類和對(duì)象【掌握】
1.類和對(duì)象的概念
類:多個(gè)具有特殊功能的個(gè)體的集合
對(duì)象:在一個(gè)類中,一個(gè)具有特殊功能的個(gè)體,能夠幫忙解決某件特定的事情,也被稱為實(shí)例【instance】
兩者之間的關(guān)系:類用于描述某一類對(duì)象的共同特征,而對(duì)象是類的具體的存在【包含關(guān)系】
思考問題:先有類還是先有對(duì)象?
【不好說,但是,在程序中使用的時(shí)候,一般是先定義類,然后創(chuàng)建對(duì)象】
舉例:
類 對(duì)象
人 王麻子,李四,尼古拉斯.趙四。。。。
快遞 韻達(dá),中通,圓通。。。。。
SupreHero 蝙蝠俠,蜘蛛俠,美國隊(duì)長,豬豬俠。。。
幫忙理解:類其實(shí)也是一種數(shù)據(jù)類型,只不過一般情況下是自定義的,所以可以將類認(rèn)為是自定義的數(shù)據(jù)類型,用法和整型,string,list等基本是相同的【定義變量,傳參】
2.類的定義
語法:
class 類名():
類體
說明:
a.Python中使用class關(guān)鍵字定義類
b.類名只要是一個(gè)合法的標(biāo)識(shí)符即可,但是要求:遵循大駝峰命名法則【首單詞的首字母大寫,不同單詞之間首字母大寫】
c.通過縮進(jìn)區(qū)分類體
d.類體一般包含兩部分內(nèi)容:對(duì)類的特征的描述、對(duì)類的行為的描述
代碼演示:
#類的定義
#類的聲明
class MyClass():
#類的實(shí)現(xiàn)
#類體
#print("hello") #一般不會(huì)這么書寫
pass
#注意:在同一個(gè)py文件中可以同時(shí)定義多個(gè)類,但是,為了提高代碼的可讀性,結(jié)合模塊的使用,最好是一個(gè)文件一個(gè)類
class MyClass1():
pass
3.類的設(shè)計(jì)【類體的實(shí)現(xiàn)】
三要素:
事物名稱【類名】:舉例:人
事物的特征【變量】:名詞,舉例:姓名,年齡。。。。
事物的行為【函數(shù)/方法】:動(dòng)詞,舉例:吃,跑。。。。
三、類中的方法和變量【掌握】
1.類中的方法和變量的定義
類中的方法和變量是為了描述事物的行為和特征
類中定義的方法被稱為成員方法
類中定義的變量被稱為成員變量,也被稱為屬性 [os.name]
成員變量:類具有的特征
成員方法:類具有的行為
類存在的意義:擁有相同特征和行為的對(duì)象可以抽取出來一個(gè)類,類的存在是為了創(chuàng)建一個(gè)具體的對(duì)象
代碼演示:
#定義類
#1.事物的名稱:類名
class Person():
#2.事物的特征:成員變量、屬性
name = ""
age = 0
height = 0.0
#3.事物的行為:成員方法【函數(shù)】
#注意:類中的成員方法區(qū)別于普通方法:參數(shù)部分一定包含self,而且最好self出現(xiàn)在參數(shù)列表的第一個(gè)
#調(diào)用函數(shù)的時(shí)候,self不需要被傳參
#初次之外,成員方法的用法和普通方法的使用完全相同,也可以設(shè)置默認(rèn)參數(shù)或者關(guān)鍵字參數(shù),不定長參數(shù)
#注意:self:自己,代表類的實(shí)例【對(duì)象】
#此處的self可以是任意的標(biāo)識(shí)符,只不過為了結(jié)合其他編程的使用,習(xí)慣上使用self
def eat(self,food):
print("eating",food)
def run(self):
print("running")
2.類中方法和屬性的使用
2.1創(chuàng)建對(duì)象【實(shí)例化對(duì)象】
已知類,通過類創(chuàng)建對(duì)象
對(duì)象的創(chuàng)建過程被對(duì)象的實(shí)例化過程
語法:變量名 = 值
對(duì)象名 = 類名()
代碼演示:
#定義類
#1.事物的名稱:類名
class Person():
#2.事物的特征:成員變量、屬性
name = ""
age = 0
height = 0.0
#3.事物的行為:成員方法【函數(shù)】
#注意:類中的成員方法區(qū)別于普通方法:參數(shù)部分一定包含self,而且最好self出現(xiàn)在參數(shù)列表的第一個(gè)
#調(diào)用函數(shù)的時(shí)候,self不需要被傳參
#初次之外,成員方法的用法和普通方法的使用完全相同,也可以設(shè)置默認(rèn)參數(shù)或者關(guān)鍵字參數(shù),不定長參數(shù)
#注意:self:自己,代表類的實(shí)例【對(duì)象】
#此處的self可以是任意的標(biāo)識(shí)符,只不過為了結(jié)合其他編程的使用,習(xí)慣上使用self
def eat(self,food):
print("eating",food)
def run(self):
print("running")
print("self的地址:", id(self))
#對(duì)象的創(chuàng)建
p1 = Person()
print(p1)
p2 = Person()
print(p2)
#p1和p2被稱為對(duì)象,變量名,引用,指向了真正的對(duì)象
#p1和p2在??臻g中開辟了空間,真正的對(duì)象的被存儲(chǔ)在堆空間中
#通過對(duì)象調(diào)用類中的成員方法和訪問類中的成員變量
#1.訪問屬性
#語法:對(duì)象.屬性名
#賦值:對(duì)象.屬性 = 值
per = Person()
print(per.name)
per.name = "小姐姐"
print(per.name)
per.age = 18
print(per.age)
per.height = 1.70
print(per.height)
#2.調(diào)用方法
#語法:對(duì)象.函數(shù)名(參數(shù)列表)
#注意:self不需要被傳參,傳參的時(shí)候注意區(qū)分參數(shù)的類型【默認(rèn)參數(shù),不定長參數(shù),關(guān)鍵字參數(shù)】
per.run()
print("per的地址:",id(per))
"""
self的地址: 2687721120880
per的地址: 2687721120880
"""
per.eat("apple")
person = Person()
person.name = "張三"
person.age = 20
print(person.name,person.age)
person.run()
person.eat("")
#結(jié)論:類中的成員變量和成員方法隨著對(duì)象的出現(xiàn)而出現(xiàn)
總結(jié):
訪問變量采用:對(duì)象名.屬性名
訪問方法采用:對(duì)象名.方法名(參數(shù)列表)
3.內(nèi)存中的對(duì)象
per = Person()
說明:
a.程序中定義的Person類型的變量per實(shí)際上是一個(gè)變量名,它被存放在棧內(nèi)存中,他指向?qū)嶋H的Person對(duì)象,而真正的Person對(duì)象則存放于堆內(nèi)存中
b.類中的成員變量隨著對(duì)象的出現(xiàn)而出現(xiàn),隨著對(duì)象的消失而消失
c.每個(gè)對(duì)象的成員變量會(huì)在堆空間中開辟一份自己的空間,相互之間互不影響
4.動(dòng)態(tài)綁定屬性和限制綁定
__slots__變量的作用:限制一個(gè)類中的成員變量【程序在運(yùn)行的過程中,就不能隨意的動(dòng)態(tài)綁定屬性】
語法:__slots__ = (屬性的名稱)
代碼演示:
#1.類的定義
class MyClass():
#2.成員變量
"""
num1 = 0
num2 = 10
"""
#限制屬性
#注意:被限制的屬性的名稱通過字符串的方式出現(xiàn)在元組的元素中
__slots__ = ("num1","num2")
#3.成員方法
def fun1(self):
print("fun1")
def fun2(self,num):
print(num)
#4.創(chuàng)建對(duì)象
my = MyClass()
#5.訪問類中的成員變量
my.num1 = 11
my.num2 = 22
print(my.num1,my.num2)
#6.調(diào)用類中的成員方法
my.fun1()
my.fun2(30)
#成員變量隨著對(duì)象的出現(xiàn)而出現(xiàn)的
#屬性的動(dòng)態(tài)綁定【Python是一門動(dòng)態(tài)語言】
my.n = 100
print(my.n)
my1 = MyClass()
#print(my1.n)
5.綜合案例一
代碼演示:
practiceDemo01.py文件【測(cè)試模塊】
"""
需求:使用面向?qū)ο蟮乃枷朊枋鱿旅孢@個(gè)情景
開學(xué)了,王老師讓小明,小花,小麗分別做自我介紹
需要介紹姓名,年齡,愛好,來一段才藝展示
"""
"""
分析:
老師類
特性:姓名
行為:讓學(xué)生做自我介紹
學(xué)生類
特征:姓名,年齡,愛好
行為:一段才藝展示
"""
#導(dǎo)入
"""
import practice01.teacher
import practice01.student
"""
from practice01.teacher import Teacher
from practice01.student import Student
#1.創(chuàng)建一個(gè)老師的對(duì)象
wang = Teacher()
wang.name = "王老師"
#2.創(chuàng)建一個(gè)學(xué)生的對(duì)象
xiaohua = Student()
xiaohua.name = "小花"
xiaohua.age = 18
xiaohua.hobby = "唱歌"
#3.讓老師執(zhí)行自己的行為
wang.letStudentIntroduce(wang.name,xiaohua) #stu = xiaohua
xiaoli = Student()
xiaoli.name = "小麗"
xiaoli.age = 20
xiaoli.hobby = "跳舞"
wang.letStudentIntroduce(wang.name,xiaoli)
xiaoming = Student()
xiaoming.name = "小明"
xiaoming.age = 25
xiaoming.hobby = "吹牛逼"
wang.letStudentIntroduce(wang.name,xiaoming)
teacher.py文件【實(shí)體類】
#老師類
class Teacher():
#特征:成員變量
name = ""
#行為:成員方法
def letStudentIntroduce(self,name,stu):
#老師發(fā)出指令
print(name + "讓" + stu.name + "做自我介紹")
#執(zhí)行指令
stu.introduce(stu.name,stu.age,stu.hobby)
#不同的學(xué)生展示不同的才藝
if stu.name == "小花":
stu.singSong()
elif stu.name == "小麗":
stu.dance()
else:
stu.lie()
student.py文件【實(shí)體類】
#學(xué)生類
class Student():
#特征:成員變量
name = ""
age = 0
hobby = ""
#行為:成員方法
def introduce(self,name,age,hobby):
print("大家好,我是%s,今年%d,愛好%s"%(name,age,hobby))
#唱歌
def singSong(self):
print("娘子~啊哈")
#跳舞
def dance(self):
print("廣場舞")
#吹牛逼
def lie(self):
print("我家可窮了,就養(yǎng)了幾百頭牛")
四、構(gòu)造函數(shù)和析構(gòu)函數(shù)
1.構(gòu)造函數(shù)【掌握】
采用上面的方式創(chuàng)建對(duì)象【直接給成員變量賦值】,很多的類一般傾向于創(chuàng)建成有初始狀態(tài)的
__init__:構(gòu)造函數(shù)【作用:創(chuàng)建對(duì)象,給對(duì)象的成員變量賦初始值】
構(gòu)造函數(shù):構(gòu)造器
調(diào)用的時(shí)機(jī):當(dāng)一個(gè)對(duì)象被創(chuàng)建的時(shí)候,第一個(gè)被自動(dòng)調(diào)用的函數(shù)
per = Person()
語法:
def __init__(self,args1,args2....)
函數(shù)體
說明:
a.之前的寫法中并沒有顯式的定義__init__函數(shù),說明系統(tǒng)默認(rèn)提供了一個(gè)無參的構(gòu)造函數(shù)
b.args1,args2...一般設(shè)置的形參列表和成員變量有關(guān)
代碼演示:
#1.構(gòu)造函數(shù)被調(diào)用的時(shí)機(jī)
class Check():
num1 = 0
str1 = ""
#構(gòu)造函數(shù)
def __init__(self):
print("jfahj")
def show(self):
print("show")
#注意:當(dāng)創(chuàng)建對(duì)象的時(shí)候,默認(rèn)調(diào)用了系統(tǒng)提供的無參的構(gòu)造函數(shù)
c = Check()
c.show()
#2.給構(gòu)造函數(shù)添加參數(shù)
class Check1():
name = ""
age = 0
"""
def __init__(self,n,a):
print("fajkgak")
"""
#注意2:當(dāng)使用構(gòu)造函數(shù)的時(shí)候,可以使用無參的,也可以使用有參的,在Python中的解決辦法:設(shè)置不定長參數(shù)
#注意3:Python中,一個(gè)類中只能有一個(gè)構(gòu)造函數(shù)
def __init__(self, *n):
print("fajkgak")
#注意1:當(dāng)手動(dòng)頭添加了有參的構(gòu)造函數(shù)之后,系統(tǒng)將不再提供無參的構(gòu)造函數(shù)
c1 = Check1()
c11 = Check1("fsiugh")
#3.有參構(gòu)造函數(shù)的使用
class Check2():
name = ""
age = 0
#構(gòu)造函數(shù)的形參列表:和成員變量有關(guān)
def __init__(self,n,a):
print(n,a)
name = n
age = a
#注意1:當(dāng)手動(dòng)頭添加了有參的構(gòu)造函數(shù)之后,系統(tǒng)將不再提供無參的構(gòu)造函數(shù)
c2 = Check2("zhangsan",10)
print(c2.name,c2.age) #0
#4.self的使用
class Check3():
name = ""
age = 0
#構(gòu)造函數(shù)的形參列表:和成員變量有關(guān)
def __init__(self,n,a):
print(n,a)
#self的使用:通過self來區(qū)分成員變量和局部變量,所以self.name代表name是一個(gè)全局變量【成員變量】
self.name = n
self.age = a
c3 = Check3("zhangsan",10)
print(c3.name,c3.age) #10
#5.使用self之后,可以省略成員變量的定義【掌握】
#self只是一個(gè)標(biāo)識(shí)符,可以替換成任意的標(biāo)識(shí)符
class Check4():
#構(gòu)造函數(shù)的形參列表:和成員變量有關(guān)
def __init__(self,name,age):
print(name,age)
#self的使用:通過self來區(qū)分成員變量和局部變量,所以self.name代表name是一個(gè)全局變量【成員變量】
self.name = name
self.age = age
def show(self):
print("showing")
c4 = Check4("lisi",20)
print(c4.name,c4.age)
c4.show()
2.析構(gòu)函數(shù)
與構(gòu)造函數(shù)正好相反,當(dāng)對(duì)象被銷毀的時(shí)候自動(dòng)調(diào)用的函數(shù),被稱為析構(gòu)函數(shù)
__del__:
刪除變量: del 變量名,此時(shí)可以觸發(fā)析構(gòu)函數(shù)的調(diào)用
使用情景:清理工作,比如關(guān)閉數(shù)據(jù)庫,關(guān)閉文件等
代碼演示:
import time
class Pig():
def __init__(self,name,age):
self.name = name
self.age = age
print("構(gòu)造函數(shù)被執(zhí)行")
def show(self):
print("show")
#析構(gòu)函數(shù)
def __del__(self):
print("~析構(gòu)函數(shù)被調(diào)用")
#析構(gòu)函數(shù)被調(diào)用的時(shí)機(jī):1:當(dāng)程序運(yùn)行完成的時(shí)候 2:使用del刪除變量
p = Pig("abc",10)
del p
#注意:對(duì)象釋放以后就不能再訪問了【相當(dāng)于根本未創(chuàng)建過這個(gè)對(duì)象】
#print(p.age)
time.sleep(5)
#在函數(shù)里定義的對(duì)象,會(huì)在函數(shù)結(jié)束時(shí)自動(dòng)釋放,這樣可以用來減少內(nèi)存空間的浪費(fèi)
#其實(shí)就是作用域的問題
def func():
per2 = Person("aa", 1, 1, 1)
func()
3.綜合案例二
practiceDemo02.py文件【測(cè)試模塊】
"""
需求:富二代王思聰開著豪車,很自豪的向他的新女友炫耀
富二代類
特征:姓名
行為:開車,炫耀
汽車類
特征:品牌,顏色
行為:奔馳
"""
#測(cè)試模塊
from practice02.car import Car
from practice02.richMan import RichMan
#1.創(chuàng)建一個(gè)富二代的對(duì)象
wang = RichMan("王思聰")
#2.創(chuàng)建一個(gè)汽車的對(duì)象
c = Car("瑪莎拉蒂","悶騷紅")
c.run()
#3.讓富二代執(zhí)行自己的行為
wang.driveCar(c)
wang.showCar(c)
richMan.py文件【實(shí)體類】
class RichMan():
#構(gòu)造函數(shù)
def __init__(self,name):
self.name = name
#成員函數(shù)
def driveCar(self,car):
print("富二代%s開著他的豪車%s"%(self.name,car.brand))
def showCar(self,car):
print(car.brand,car.color)
car.py文件【實(shí)體類】
class Car():
#構(gòu)造函數(shù)
def __init__(self,brand,color):
self.brand = brand
self.color = color
#成員函數(shù)
def run(self):
print("%s在馬路上奔馳"%(self.brand))