python的類和對象(1)


類和對象

現在這年頭,怎么哪里都有對象?街上看了一路手拉手,回來學習還要看到”對象“。
是不是學會了對象,就有對象了?

1.定義:

百度解釋:
對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數據類型。
它們的關系是,對象是類的實例,類是對象的模板。
港真,第一次接觸這么專業的詞語時,我是懵逼的。

看來,對象不是那么好找的。

好了,正經一點。要學習的呢! 什么是類,什么是對象呢?
通俗一點講:
拿化妝這件事來比喻,可以把類理解成“妝容”(一個大概念),而對象可以理解成“煙熏妝”、“復古妝”、“咬唇妝”、“新娘妝”(具體的妝容)。
又或者拿我們吃的面來講,可以把類理解成“面”,

而對象可以理解成“熱干面”、“牛肉刀削面”、“蔥油拌面”、“川味涼面”……等等。

可以看出,類就是一個抽象的概念,它不具體指代某一樣東西。類似上級下達的一個總方針、指令(看做一個類),而對象就是具體到每一個人的實行方案。每位員工在接到上級命令后,因不一樣的處境、邏輯思維,最后,小明有了小明的執行方案(對象A),小紅有了小紅的執行方案(對象B)。
可以說,類是一個基礎,在此基礎上,發展出了各個對象。(就像有了爸爸,后來有了很多很多個可愛的兒子(●'◡'●)。)

2.說說為什么要用類

故事是這樣子滴
Hush 今天想畫個煙熏妝,流程如下:
潔面 --- 化妝水 --- 面部精華 --- 乳液/面霜 --- 防曬霜 --- 粉底 --- 散粉 --- 畫眉 --- 腮紅 --- 口紅

#煙熏妝
def MakeupSmokyClean():
    #清潔步驟
    print("煙熏妝清潔完畢")

def MakeupSmokyWater():
    #補水步驟
    print("煙熏妝補水完畢")
    
def MakeupSmokyeEssence():
    #搽精華步驟
    print("煙熏妝搽精華液完畢")
    
def MakeupSmokyCream():
    #搽面霜步驟
    print("煙熏妝搽面霜完畢")
    
def MakeupSmokySunscreen():
    #防曬步驟
    print("煙熏妝防曬完畢")
    
def MakeupSmokyFoundation():
    #上粉底步驟
    print("煙熏妝上粉底完畢")
    
def MakeupSmokyLoosepowder():
    #上散粉步驟
    print("煙熏妝定妝完畢")
    
def MakeupSmokyEyebrows():
    #畫眉步驟
    print("煙熏妝畫眉完畢")
    
def MakeupSmokyBlush():
    #上腮紅步驟
    print("煙熏妝畫腮紅完畢")
    
def MakeupSmokyLipstick():
    #塗口紅步驟
    print("煙熏妝塗口紅完畢")

def MakeupSmokyCheck():
    #最后檢查一下
    print("檢查完畢")
    
MakeupSmokyClean()
MakeupSmokyWater()
MakeupSmokyeEssence()
MakeupSmokyCream()
MakeupSmokySunscreen()
MakeupSmokyFoundation()
MakeupSmokyLoosepowder()
MakeupSmokyEyebrows()
MakeupSmokyBlush()
MakeupSmokyLipstick()
MakeupSmokyCheck()
煙熏妝清潔完畢
煙熏妝補水完畢
煙熏妝搽精華液完畢
煙熏妝搽面霜完畢
煙熏妝防曬完畢
煙熏妝上粉底完畢
煙熏妝定妝完畢
煙熏妝畫眉完畢
煙熏妝畫腮紅完畢
煙熏妝塗口紅完畢
檢查完畢

終於畫完了!畫個妝不容易呀!
Hush 坐下來,看了看 Taylor 的照片,想了想要不明天來個復古妝?

於是,第二天出門前,Hush又開始她的化妝表演……

#復古妝
def MakeupRetroClean():
    #清潔步驟
    print("復古妝清潔完畢")

def MakeupRetroWater():
    #補水步驟
    print("復古妝補水完畢")
    
def MakeupRetroEssence():
    #搽精華步驟
    print("復古妝搽精華液完畢")
    
def MakeupRetroCream():
    #搽面霜步驟
    print("復古妝搽面霜完畢")
    
def MakeupRetroSunscreen():
    #防曬步驟
    print("復古妝防曬完畢")
    
def MakeupRetroFoundation():
    #上粉底步驟
    print("復古妝上粉底完畢")
    
def MakeupRetroLoosepowder():
    #上散粉步驟
    print("復古妝定妝完畢")
    
def MakeupRetroEyebrows():
    #畫眉步驟
    print("復古妝畫眉完畢")
    
def MakeupRetroBlush():
    #上腮紅步驟
    print("復古妝畫腮紅完畢")
    
def MakeupRetroLipstick():
    #塗口紅步驟
    print("復古妝塗口紅完畢")

def MakeupRetroCheck():
    #最后檢查一下
    print("檢查完畢")
    
MakeupRetroClean()
MakeupRetroWater()
MakeupRetroEssence()
MakeupRetroCream()
MakeupRetroSunscreen()
MakeupRetroFoundation()
MakeupRetroLoosepowder()
MakeupRetroEyebrows()
MakeupRetroBlush()
MakeupRetroLipstick()
MakeupRetroCheck()
復古妝清潔完畢
復古妝補水完畢
復古妝搽精華液完畢
復古妝搽面霜完畢
復古妝防曬完畢
復古妝上粉底完畢
復古妝定妝完畢
復古妝畫眉完畢
復古妝畫腮紅完畢
復古妝塗口紅完畢
檢查完畢

哇,終於畫完了,每次化妝都要這么久,如果我活個八十歲,那不是要……
然后,Hush趕不上7點40分的地鐵。最后遲到了。
老板要扣錢!扣錢!扣錢!
穩食艱難 看看自己的口袋,啊,我的錢,不活了……
But……
主角不能死啊,於是,Hush慢慢冷靜下來
Hush想:有沒有一個神器,可以讓這些通用的步驟一鍵完成,其他的(比如高光、遮瑕、眼影,balabala的)化妝步驟在Hush心情特別好 or 出席隆重場合時才特別寫出來呢?

上天保佑,大神們早早就創造出了 Hush 想要的“類”
類把通用的特性封裝在一個盒子里,你想用的時候調用這個類就行了。
如果你有新的有獨創性的東西,你可以重新 def 一下你需要重新定義的,覆蓋掉以前的寫的東西,其他沒改變的地方就不用重新def (不寫就代表你繼續用以前的方法,不做改變),這樣你就可以剩下很多很多的時間啦。時間誠可貴呀!

下面是時候見識一下的強大啦:

class Makeup(object):
    "基本化妝步驟"
    def __init__(self, style):
        self.style = style
        
    def Clean(self):
        #清潔步驟
        print(self.style + "清潔完畢")

    def Water(self):
        #補水步驟
        print(self.style + "補水完畢")
    
    def Essence(self):
        #搽精華步驟
        print(self.style + "搽精華液完畢")
    
    def Cream(self):
        #搽面霜步驟
        print(self.style + "搽面霜完畢")
    
    def Sunscreen(self):
        #防曬步驟
        print(self.style + "防曬完畢")
    
    def Foundation(self):
        #上粉底步驟
        print(self.style + "上粉底完畢")
    
    def Loosepowder(self):
        #上散粉步驟
        print(self.style + "定妝完畢")
    
    def Eyebrows(self):
        #畫眉步驟
        print(self.style + "畫眉完畢")
    
    def Blush(self):
        #上腮紅步驟
        print(self.style + "畫腮紅完畢")
    
    def Lipstick(self):
        #塗口紅步驟
        print(self.style + "塗口紅完畢")
    
    def Check(self):
        #檢查
        print("檢查完畢")

    def integrate():
        #一鍵組合
        Clean()
        Water()
        Essence()
        Cream()
        Sunscreen()
        Foundation()
        Loosepowder()
        Eyebrows()
        Blush()
        Lipstick()
        Check()
        print(self.style + "一鍵組合完畢")

在類里面,參數 style 可以是我們想要的各種妝容,可以是煙熏妝、復古妝、新娘妝……
不用每一次畫一種妝,都要一步一步地寫同樣的東西啦……
相當於有了個基本框架 Makeup,我們具體的每一種妝容可以繼承這個框架,也可以修改框架里的東西,也可以擴展新的東西。這就是類的絕妙之處啦!

我們較完整的化妝步驟為:
潔面 --- 化妝水 --- 面部精華 --- 乳液/面霜 --- 防曬霜 ---粉底---(遮瑕)---散粉---畫眉---眼影---眼線---睫毛膏---修容---高光----腮紅---口紅
如果我們想在上面已寫的程序基礎上,加個眼影、眼線,那么我們就要在上面Makeup的基礎上,加上

class Advanced1(Makeup):   #兒子寫在前面,爸爸寫在括號里(正經點,就是派生類在外面,基類在括號里)
    def Eyeshadow(self):
        #畫眼影
        print(self.style + "畫眼影完畢")
    
    def Eyeliner(self):
        #畫眼線
        print(self.style + "畫眼線完畢")

其他步驟不用重復寫,就相當於直接繼承老爸的特性。
意味着 Hush 完成了 :潔面 --- 化妝水 --- 面部精華 --- 乳液/面霜 --- 防曬霜 --- 粉底 --- 散粉 --- 畫眉 --- 腮紅 --- 口紅。

And then,因為每種妝容的特點是不一樣的,我們拿眉型來說,不一樣的妝容,它強調的東西、想要表達的東西是不一樣的,那么眉頭、眉峰、眉尾、眉的傾斜度、眉的長度是不一樣的。
比如我們今天回家,第一,考慮到不化妝,可能有點殘,爸爸媽媽以為我經歷了什么風霜;第二,化太濃,老爸老媽會擔心,女兒是不是在外面學壞了。Consequently,今天要畫淡妝。要這樣這樣畫:

class Advanced2(Makeup):
    def Eyebrows(self):
        #淡妝畫眉步驟,bala bala
        print(self.style + "畫眉完畢")

這就相當於覆蓋了原來的畫眉方法(也可以說,重寫了畫眉步驟)。這樣,我們就有了淡妝的專屬眉妝。

從整個復雜、漫長的化妝過程來看,我們深有體會到類的好處。
有了類,我們可以支配更多的時間。
In conclusion:
類的好處最能體現在繼承這一點上。

  • 我們可以直接復用代碼,不用花時間寫重復的東西,同時可以降低出錯率
  • 我們也可以在類的基礎上,擴展新方法

Consequently,我們要用到類來幫助我們成為一個懶惰的程序員呀。

3.什么是類、對象

下面放上官方解釋:

  • 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
  • 方法:類中定義的函數。
  • 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
  • 數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
  • 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
  • 局部變量:定義在方法中的變量,只作用於當前實例的類。
  • 實例變量:在類的聲明中,屬性是用變量來表示的。這種變量就稱為實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。
  • 繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關系(例圖,Dog是一個Animal)。
  • 實例化:創建一個類的實例,類的具體對象。
  • 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。

可以說,類 = 屬性 + 方法

#常見格式
class ClassName:  #類的名字,采用大駝峰命名法
    <statement-1>
    .
    .
    .
    <statement-N>

在statement里,一般會定義類的屬性和方法。

而對象是類的實例化。在實例化后,就可以用類的屬性和方法啦。

舉個栗子:實例化一個類並用其屬性及方法
先定義一個類

class Beauty():
    #定義一個類,有屬性,有方法
    name = "Taylor"
    
    def Words(self):
        return("You are my sunshine.")
a = Beauty()   #將類Beauty實例化

print("類Beauty的屬性 name 為:", a.name)

print("類Beauty的方法 Words 為:", a.Words())
類Beauty的屬性 name 為: Taylor
類Beauty的方法 Words 為: You are my sunshine.


哎呀,我女神真漂亮,我什么時候能變得這么beautiful呀?

先到這,下篇繼續~~


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com