10-Python對(duì)象

一、面向?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))
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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