狠狠色丁香婷婷久久综合麻豆,国产99久久久久久免费看,与亲女洗澡时伦了视频,一面膜胸口一面膜下免费

面向?qū)ο蠼榻B

1.什么是面向?qū)ο蠛兔嫦蜻^程編程思想

面向過程:

專注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)東陽免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

1.核心是‘過程’二字
2.過程的含義是將程序流程化
3.過程是流水線,用來分步驟解決問題的

程序=數(shù)據(jù)+功能

面向?qū)ο螅?/p>

1.核心是‘對(duì)象’二字
2.對(duì)象的含義是將程序進(jìn)行整合
3.對(duì)象是‘容器’,用來盛放數(shù)據(jù)和功能(變量和函數(shù))

總結(jié):以做西紅柿雞蛋面為例:

面向過程:我需要買西紅柿--》買雞蛋、面--》把西紅柿洗好、雞蛋打好...等等
面向?qū)ο螅赫覀€(gè)人幫我干活,我只需要告訴那個(gè)人我需要吃西紅柿雞蛋面(調(diào)用該對(duì)象),具體的過程交給別人干。

python中可以用來盛放數(shù)據(jù)和功能的‘容器’可以是字典、列表、集合等。但是這些容器在存放功能的時(shí)候,并不能把功能的具體代碼全部傳進(jìn)去(只能傳一個(gè)函數(shù)名),這就有一定的局限性!

那么。python中提供了什么樣的語法來讓我們更好的存放數(shù)據(jù)和功能呢??

2.類

類,其實(shí)也是‘容器’,它是用來存放對(duì)象1、對(duì)象2、對(duì)象3...等共有的數(shù)據(jù)和功能!

它能夠更好的節(jié)省空間并且?guī)臀覀兏猛瓿擅嫦驅(qū)ο蟮木幊蹋?/p>

2.1 類的引入

先定義類(找到對(duì)象共有的數(shù)據(jù)和功能),然后在調(diào)用類產(chǎn)生具體的對(duì)象!!

# 所有類體中最常見的就是變量和功能的定義,但是類體中也可以包含其他代碼
# 注意:類體中的代碼是在定義階段就會(huì)執(zhí)行的,也就是說在定義階段就開辟了名稱空間

class ClassName: # 類的定義 class 類名(駝峰體命名規(guī)則):
    # 變量(數(shù)據(jù))的定義
    var = 111
    # 功能的定義
    def send(self):
        pass

    def rcv(self):
        pass
		
# 類中提供了一個(gè)方法查看類的名稱空間.__dict__,得到一個(gè)字典
print(ClassName.__dict__)
# __dict__[key]調(diào)用類體中的變量值或者功能
print(ClassName.__dict__['send'])
# 為了簡便上述的調(diào)用方式,類提供了.變量/.函數(shù)名的方法來調(diào)用,注意不加括號(hào)
print(ClassName.send)

2.2 類的調(diào)用--產(chǎn)生對(duì)象

# 類的調(diào)用,類名()的方式返回了一個(gè)class_obj對(duì)象,就是把類和該對(duì)象建立了一個(gè)聯(lián)系,該對(duì)象就可以使用類里面的定義的變量和功能了
class_obj = ClassName()

# 該對(duì)象的.__dict__方法得到的是一個(gè)空字典,可以使用對(duì)象.屬性名=屬性值的方式給該字典添加值
print(class_obj.__dict__)

# 類名.變量名/類名.函數(shù)名 調(diào)用類的變量和功能
print(class_obj.var)

2.3 類的__init__方法

當(dāng)對(duì)象1、對(duì)象2、對(duì)象3...等的屬性都一樣,只是值不同的時(shí)候,我們不斷的使用對(duì)象.屬性=屬性值給對(duì)象賦值的時(shí)候,不免需要個(gè)每個(gè)對(duì)象都這樣操作,這樣會(huì)使得代碼冗余。

因此類中有一個(gè) __init__的初始化方法,會(huì)自動(dòng)幫你封裝好這個(gè)對(duì)象獨(dú)有的屬性,你只需要在調(diào)用的時(shí)候傳入對(duì)應(yīng)的屬性值就行。

class ClassName:
    # 參數(shù)self表示調(diào)用類時(shí)產(chǎn)生的對(duì)象,x和y是調(diào)用類時(shí)對(duì)應(yīng)傳入的參數(shù)
    def __init__(self,x,y):
        self.name = x
        self.age = y

# 調(diào)用類產(chǎn)生對(duì)象的操作,實(shí)際上是類的實(shí)例化的過程,這個(gè)過程發(fā)生了三件事
# 1.產(chǎn)生了一個(gè)空對(duì)象
# 2.自動(dòng)調(diào)用類里面的__init__方法,并將調(diào)用時(shí)候的參數(shù)對(duì)應(yīng)傳給__init__方法
# 3.返回初始化好的對(duì)象class_obj
class_obj = ClassName('zhang',18)

總結(jié):

1.該方法會(huì)在調(diào)用類的時(shí)候自動(dòng)執(zhí)行,用來為對(duì)象初始化自己獨(dú)有的屬性
2.該方法內(nèi)存放的是為對(duì)象初始化屬性的功能,但是也可以存放其他需要在調(diào)用時(shí)就執(zhí)行的代碼
3.該方法的返回值只能是none

2.4 類中的屬性查找和綁定方法

1.數(shù)據(jù)屬性的查找

類中屬性查找的順序是對(duì)象先從自己那查找,如果找不到該屬性,則去類里面查找。對(duì)象修改添加屬性和屬性值,這并不會(huì)影響類里面對(duì)應(yīng)的屬性,其余對(duì)象獲取到的還是原來類里面定義的屬性值

類中定義了對(duì)象所需要的所有的共有屬性和功能,大家訪問共有屬性和功能的地址都是一樣的。

2.類中函數(shù)方法的綁定

正在調(diào)用類中的方法是需要按照:類名.函數(shù)名(對(duì)象)的方法進(jìn)行調(diào)用,但是這樣未免太過麻煩。

所以,類提供了一種綁定方法:對(duì)象在調(diào)用類中功能(函數(shù))時(shí),會(huì)自動(dòng)把該對(duì)象當(dāng)成參數(shù)自動(dòng)傳入。
對(duì)象1.類中函數(shù)名()==類名.函數(shù)名(對(duì)象) #這里默認(rèn)函數(shù)名傳入了對(duì)象1

回顧一下列表、字典,其實(shí)也是采用了類的思想!
l=[11,22,33] 等價(jià)于 l=list([11,22,33])
其實(shí)list就是一個(gè)類,l就是一個(gè)對(duì)象
l.append('dd')等價(jià)于list.append(l,'dd') 就是調(diào)用list類里的append方法

2.5 類中如何隱藏屬性和方法

在屬性名和方法前加__前綴,就會(huì)實(shí)現(xiàn)一個(gè)隱藏的效果,外界就不能調(diào)用該屬性了。

該方法和屬性只是語法形式上的變形,通過__dict__查看其真正的語法名,然后在外部也是可以訪問到的!

隱藏屬性和方法在外部訪問不到,但是在類內(nèi)部還是可以訪問到的

這樣操作的目的是:不讓外部輕易的訪問到內(nèi)部的屬性,即使需要訪問,也必須需要一些條件。比如:需要訪問類中的隱藏屬性就必須調(diào)用類中的某種方法(方法中可以進(jìn)行判斷、條件限制),符合條件則該方法里可以訪問到隱藏屬性!!

2.6 類中的property

property其實(shí)就是一種裝飾器,它的功能是把類中的方法偽裝成數(shù)據(jù)屬性,調(diào)用的時(shí)候就不用調(diào)用該方法了,直接把方法當(dāng)成數(shù)據(jù)調(diào)用即可(不用加括號(hào)了)。

class ClassName: 
    def __init__(self):
	self.__name = name
    @property #法一:
    def get(self):
        return __self.name

    def set(self,val):
        self.__name = val
    # 法二:偽裝的更像了 
    name = property(get,set)
    # 法二改進(jìn):直接在函數(shù)上加@name.setter(修改值裝飾器)@name.deleter(刪除值裝飾器)@property(獲取值裝飾器),然后把函數(shù)名都改成name
class_obj = ClassName()
# 法一調(diào)用,不用加括號(hào)了
class_obj.get
# 法二調(diào)用
class_obj.name #獲取名字
class_obj.name=123 #修改名字

2.7 類中classmethod方法

在類中,我們定義的方法默認(rèn)是綁定給對(duì)象的,即在實(shí)例化類的時(shí)候,對(duì)象會(huì)默認(rèn)當(dāng)成參數(shù)傳入到類中的方法里面。
obj = ClassName() #這里obj自動(dòng)傳入了

如何定義一個(gè)方法,該方法是默認(rèn)傳入類的呢??

只需要在我們需要綁定的方法前面加上@classmethod就行,下次我們?cè)谡{(diào)用該類的方法時(shí)會(huì)自動(dòng)傳入該類名,調(diào)用者是類。

class B:
    @classmethod
    def fun(cls):
        return cls(xxx,xxx) 
# 調(diào)用類方法
B.fun()  # 會(huì)自動(dòng)將類自動(dòng)穿給cls,然后調(diào)用fun函數(shù),提供了一種新的造對(duì)象的方式

用途:提供了一種新的造對(duì)象的方式

2.8 類中的staticmethod方法

不需要綁定給類或者對(duì)象的方法,在對(duì)應(yīng)函數(shù)上加上@staticmethod,調(diào)用者可以是類或者對(duì)象,沒有自動(dòng)傳參的效果。

class B:
    @staticmethod
    def fun(v,y):
        pass
		
obj = 	B()
# 靜態(tài)方法可以通過類或者對(duì)象調(diào)用
obj.fun(v,y)
B.fun(v,y)

3. 面向?qū)ο蟮娜筇匦?/h2>

3.1 封裝

封裝其實(shí)就是整合,對(duì)于共有的數(shù)據(jù)和功能進(jìn)行整合。

3.2 繼承

3.2.1 什么是繼承

繼承是一種創(chuàng)建新類的方式,新建的類可以稱為子類或者派生類,繼承的類可以稱為父類或者基類

python支持多繼承,就是一個(gè)新建的類可以繼承多個(gè)父類,python3默認(rèn)繼承object類,在python2中繼承了object的叫新式類,沒有繼承的叫經(jīng)典類,python2中需要手動(dòng)書寫需要繼承的類,不會(huì)默認(rèn)繼承object。

class Student(object): 
    pass

class Student2(object):
    pass
class Sub(Student):# 父類是Student
    pass

class Sub2(Student,Student2): # 父類是Student和Student2
    pass
	
print(Sub2.__bases__) #查看對(duì)應(yīng)類的父類

3.2.2 為什么要用繼承

優(yōu)點(diǎn):類是用來對(duì)象數(shù)據(jù)和功能冗余的問題,而類是用來解決類與類的冗余
缺點(diǎn):代碼的可讀性變差,擴(kuò)展性也將變差(現(xiàn)實(shí)中不建議使用多繼承,如果要用,建議使用Mixins機(jī)制)

3.2.3 繼承中的菱形問題的屬性查找(后磚石問題)

菱形問題實(shí)際指的是,在python2和python3中菱形模式的繼承會(huì)導(dǎo)致,繼承查找順序不一致的問題!!,這個(gè)需要注意!

注意:菱形繼承最終繼承的A類是一個(gè)非object類,才叫菱形繼承

D類繼承了B和C類,B和C類分別繼承了A類,如果A中有一個(gè)方法,B和C都重寫了該方法,而D沒有重寫,那么D繼承的是哪個(gè)版本的方法呢?

class A:
    def test(self):
        print('from A')

class B(A):
    def test(self):
        print('from B')

class C(A):
    def test(self):
        print('from C')

class D(B,C): 
    pass
	
print(D.mro()) #該方法可以得到一個(gè)mro列表,列表里就是該類屬性查找的順序列表!
obj = D()
obj.test()
# 查找會(huì)從D-->B-->C-->A-->object,如果D的父類順序換了,則查找順序也會(huì)變成D-->C-->B-->A-->object(廣度優(yōu)先原則),python2中的經(jīng)典類就不一樣了,查找順序?yàn)镈-->B-->A-->C深度優(yōu)先原則)

其實(shí),對(duì)于你定義的每一個(gè)類,python都會(huì)計(jì)算出一個(gè)方法解析順序(MRO)列表,該MRO列表就是一個(gè)簡單的所有基類的線性順序列表。

對(duì)象.mro()或者類.mro() #查看MRO線性順序列表

python會(huì)在MRO列表中從左到右開始查找基類,知道找到第一個(gè)匹配這個(gè)屬性的類為止,這個(gè)MRO列表的構(gòu)造是通過一個(gè)C3線性化算法來實(shí)現(xiàn)的(了解一下即可)。

3.2.4 非菱形問題下的查找順序

python2和3的查找順序?yàn)椋篈-->B--->E--->C--->F--->D---object(按照?qǐng)D中從左到右的分支一個(gè)個(gè)查找)

3.2.5 多繼承下的mixins機(jī)制

mixins機(jī)制的核心:就是在多繼承的背景下盡可能的提升多繼承的可讀性

python的多繼承類中,應(yīng)當(dāng)只有一個(gè)標(biāo)識(shí)其歸屬含義的父類,意思是保證多繼承的類遵循繼承‘is-a’的原則,其余繼承的類都應(yīng)該是mixin類,該類的命名規(guī)范一般是以mixin、able、ible為后綴。

mixin類只是用來表達(dá)某一類功能的類,并不決定子類的歸屬,它也不依賴于子類的實(shí)現(xiàn),而且子類也并不是完全依賴mixin類,缺少了該類,子類照常工作,只是缺少了某種功能罷了!!

最后,mixin類盡量少用,當(dāng)mixin類很多的時(shí)候,依然會(huì)造成可讀性差的問題!!

3.2.6 子類派生的新方法中如何重用父類功能

法一:指名道姓的調(diào)用某一個(gè)類下面的函數(shù),該方法不依賴類的繼承


class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age

class B:
    def __init__(self,name,age,work):
        A.__init__(self,name,age) # 法一:指名道姓
        self.work = work

obj = B('zhang','18','python')
print(obj.__dict__)

法二:super()方法,該方法嚴(yán)格依賴?yán)^承關(guān)系

調(diào)用super()會(huì)得到一個(gè)特殊的對(duì)象,注意該對(duì)象是參照當(dāng)前發(fā)起屬性查找那個(gè)類的mro,去當(dāng)前類的父類中查找屬性!! 輔助下面的列子進(jìn)行理解!

class A:
    def test(self):
        print('from A')
        super(A, self).test() # python3中super也可以省略括號(hào)里的參數(shù)

class B:
    def test(self):
        print('from B')

class C(A,B):
    pass

obj = C()
obj.test()
# 1.首先會(huì)到obj對(duì)象里面去找test方法
# 2.再去C里面找
# 3.再去A里面找test方法,找到了打印
# 4.然后遇到了super()會(huì)得到一個(gè)特殊的對(duì)象,該對(duì)象參照當(dāng)前發(fā)起屬性查找的類的mro就是C這個(gè)類,去當(dāng)前調(diào)用super()方法的父類中查找test屬性
# 5.C這個(gè)類的mro是[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
# 6.當(dāng)前super()方法的父類是B
print(C.mro())

3.3 多態(tài)與鴨子類型

3.3.1什么是多態(tài)

多態(tài)指的是:同一種事物有多種形態(tài)

多態(tài)性和鴨子類型的本質(zhì)在于,不同的類中定義了相同的方法名,這樣我們就可以不考慮類而統(tǒng)一用一種方式去使用對(duì)象。

比如,所有的類中都定義了read和write方法,那么我們?cè)谡{(diào)用的時(shí)候就可以不考慮類,直接讓類實(shí)例化出來的對(duì)象調(diào)用read和write方法就行。

class Animal:
    def say():
        pass
    def run():
        pass

class People:
    def say():
        pass
    def run():
        pass

class Dog:
    def say():
        pass
    def run():
        pass
		
obj1=Animal()
obj2=People()
obj3=Dog()

我們?cè)谑褂玫臅r(shí)候就可以任何對(duì)象都可以.say、.run,而不用考慮類名
同時(shí),我們也可以開設(shè)一個(gè)統(tǒng)一的接口,該接口只需要傳入對(duì)象就可以自動(dòng)調(diào)用對(duì)象對(duì)應(yīng)的方法了

def say(obj):
   obj.say()

補(bǔ)充:用父類規(guī)范子類

在python中,我們可以用父類規(guī)范子類(在父類中的方法,子類必須有)

import abc

# 使父類繼承一個(gè)抽象基類
class Person(metaclass=abc.ABCMeta):
    # 在需要子類必須擁有該方法的上面加上@abc.abstractmethod
    @abc.abstractmethod
    def say(self):
        print('xixixi')

class A(Person):
    # 子類沒有該方法會(huì)報(bào)錯(cuò)
    def say(self):
        pass

obj = A()

分享文章:面向?qū)ο蠼榻B
當(dāng)前鏈接:http://www.hntjjpw.com/article12/dsogidc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google微信小程序定制網(wǎng)站標(biāo)簽優(yōu)化營銷型網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
主站蜘蛛池模板: 竹北市| 科尔| 卢氏县| 台安县| 蓬莱市| 施秉县| 萍乡市| 桐城市| 安远县| 大悟县| 临朐县| 井陉县| 大厂| 敦煌市| 确山县| 宜阳县| 九江市| 滦平县| 前郭尔| 富川| 嵩明县| 社旗县| 抚顺县| 泸水县| 洪湖市| 乌拉特中旗| 潢川县| 铁岭市| 富平县| 遵义市| 巴东县| 沈阳市| 会东县| 新余市| 会泽县| 杭锦后旗| 沙田区| 文昌市| 乌拉特中旗| 桃源县| 阳原县|