真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python學(xué)習(xí)—面向?qū)ο髮W(xué)習(xí)上-創(chuàng)新互聯(lián)

面向?qū)ο蠛?jiǎn)介

OOP編程是利用“類”和“對(duì)象”來(lái)創(chuàng)建各種模型來(lái)實(shí)現(xiàn)對(duì)真實(shí)世界的描述,使用面向?qū)ο缶幊痰脑蛞环矫媸且驗(yàn)樗梢允钩绦虻木S護(hù)和擴(kuò)展變得更簡(jiǎn)單,并且可以大大提高程序開發(fā)效率 ,另外,基于面向?qū)ο蟮某绦蚩梢允顾烁尤菀桌斫饽愕拇a邏輯,從而使團(tuán)隊(duì)開發(fā)變得更從容。

建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)建站專業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、自適應(yīng)網(wǎng)站建設(shè)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

面向?qū)ο蟮娜筇匦?/h4>

Encapsulation 封裝
把客觀事物封裝成抽象的類,并且類可以把自己的屬性和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。
注意的是。這里說(shuō)的屬性并不僅僅是基本數(shù)據(jù)類型,還包括引用數(shù)據(jù)類型,也就是說(shuō),我們同樣可以在一個(gè)類中封裝其他類的對(duì)象,使其在這個(gè)類中實(shí)現(xiàn)引用類的相應(yīng)辦法。

Inheritance 繼承
首先,什么叫繼承呢?從理解上來(lái)說(shuō)就是兒子獲得了父親所有的東西,并且這些東西是屬于兒子的,兒子可以隨意支配。那么從編程語(yǔ)言角度出發(fā),就是一個(gè)類獲取了另外一個(gè)類的全部方法,并且對(duì)這些方法進(jìn)行自主的支配。在這里,被別人繼承的類,我們叫父類,也叫超類或者基類。而繼承了父類的類呢,就叫子類,也叫派生類。
所以一個(gè)類可以派生出子類,而子類會(huì)自動(dòng)繼承在這個(gè)父類里定義的屬性、方法

Polymorphism 多態(tài)
多態(tài)的定義:指允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)

實(shí)現(xiàn)多態(tài)的技術(shù)稱為:動(dòng)態(tài)綁定(dynamic binding),是指在執(zhí)行期間判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。

多態(tài)是面向?qū)ο蟮闹匾匦?簡(jiǎn)單點(diǎn)說(shuō):“一個(gè)接口,多種實(shí)現(xiàn)”,指一個(gè)基類中派生出了不同的子類,且每個(gè)子類在繼承了同樣的方法名的同時(shí)又對(duì)父類的方法做了不同的實(shí)現(xiàn),這就是同一種事物表現(xiàn)出的多種形態(tài)。

現(xiàn)實(shí)中,關(guān)于多態(tài)的例子不勝枚舉。比方說(shuō)按下 F1 鍵這個(gè)動(dòng)作,如果當(dāng)前在 Flash 界面下彈出的就是 AS 3 的幫助文檔;如果當(dāng)前在 Word 下彈出的就是 Word 幫助;在 Windows 下彈出的就是 Windows 幫助和支持。同一個(gè)事件發(fā)生在不同的對(duì)象上會(huì)產(chǎn)生不同的結(jié)果。就好像糖一樣,有多種口味,你想吃什么口味的就可以吃什么口味。但在程序中,卻不是你想要怎樣就怎樣。更多的是需要怎樣去做就怎樣去做。來(lái)一個(gè)算是比較官方的解釋:在面向?qū)ο笳Z(yǔ)言中,接口的多種不同的實(shí)現(xiàn)方式即為多態(tài)。

編程其實(shí)就是一個(gè)將具體世界進(jìn)行抽象化的過(guò)程,多態(tài)就是抽象化的一種體現(xiàn),把一系列具體事物的共同點(diǎn)抽象出來(lái), 再通過(guò)這個(gè)抽象的事物, 與不同的具體事物進(jìn)行對(duì)話。
對(duì)不同類的對(duì)象發(fā)出相同的消息將會(huì)有不同的行為。比如,你的老板讓所有員工在九點(diǎn)鐘開始工作, 他只要在九點(diǎn)鐘的時(shí)候說(shuō):“開始工作”即可,而不需要對(duì)銷售人員說(shuō):“開始銷售工作”,對(duì)技術(shù)人員說(shuō):“開始技術(shù)工作”, 因?yàn)椤皢T工”是一個(gè)抽象的事物, 只要是員工就可以開始工作,他知道這一點(diǎn)就行了。至于每個(gè)員工,當(dāng)然會(huì)各司其職,做各自的工作。
多態(tài)允許將子類的對(duì)象當(dāng)作父類的對(duì)象使用,某父類型的引用指向其子類型的對(duì)象,調(diào)用的方法是該子類型的方法。這里引用和調(diào)用方法的代碼編譯前就已經(jīng)決定了,而引用所指向的對(duì)象可以在運(yùn)行期間動(dòng)態(tài)綁定

封裝

1.類和對(duì)象

Class 類
一個(gè)類即是對(duì)一類擁有相同屬性的對(duì)象的抽象、藍(lán)圖、原型。在類中定義了這些對(duì)象的都具備的屬性(variables(data))、共同的方法。
對(duì)事物抽象出來(lái)類,即是封裝。

Object 對(duì)象
一個(gè)對(duì)象即是一個(gè)類的實(shí)例化后的實(shí)例,即對(duì)象是類的實(shí)例。一個(gè)類必須經(jīng)過(guò)實(shí)例化后方可在程序中調(diào)用,一個(gè)類可以實(shí)例化多個(gè)對(duì)象,每個(gè)對(duì)象亦可以有不同的屬性,就像人類是指所有人,每個(gè)人是指具體的對(duì)象,人與人之前有共性,亦有不同

python中使用class保留字來(lái)定義類,類名的首字母一定要大寫。

以Student類為例,在Python中,定義類是通過(guò)class關(guān)鍵字:

class Student(object):
    pass

class后面緊接著是類名,即Student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個(gè)類繼承下來(lái)的,繼承的概念我們后面再講,通常,如果沒(méi)有合適的繼承類,就使用object類,這是所有類最終都會(huì)繼承的類。

定義好了Student類,就可以根據(jù)Student類創(chuàng)建出Student的實(shí)例,創(chuàng)建實(shí)例是通過(guò)類名+()實(shí)現(xiàn)的:

>>> bart = Student()
>>> bart
<__main__.Student object at 0x10a67a590>
>>> Student


可以看到,變量bart指向的就是一個(gè)Student的實(shí)例,后面的0x10a67a590是內(nèi)存地址,每個(gè)object的地址都不一樣,而Student本身則是一個(gè)類。

可以自由地給一個(gè)實(shí)例變量綁定屬性,比如,給實(shí)例bart綁定一個(gè)name屬性:

>>> bart.name = 'Bart Simpson'
>>> bart.name
'Bart Simpson'

由于類可以起到模板的作用,因此,可以在創(chuàng)建實(shí)例的時(shí)候,把一些我們認(rèn)為必須綁定的屬性強(qiáng)制填寫進(jìn)去。通過(guò)定義一個(gè)特殊的__init__方法,在創(chuàng)建實(shí)例的時(shí)候,就把name,score等屬性綁上去:

class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score

注意:特殊方法“__init__”前后分別有兩個(gè)下劃線!??!

注意到__init__方法的第一個(gè)參數(shù)永遠(yuǎn)是self,表示創(chuàng)建的實(shí)例本身,因此,在__init__方法內(nèi)部,就可以把各種屬性綁定到self,因?yàn)閟elf就指向創(chuàng)建的實(shí)例本身。

有了__init__方法,在創(chuàng)建實(shí)例的時(shí)候,就不能傳入空的參數(shù)了,必須傳入與__init__方法匹配的參數(shù),但self不需要傳,Python解釋器自己會(huì)把實(shí)例變量傳進(jìn)去:

>>> bart = Student('Bart Simpson', 59)
>>> bart.name
'Bart Simpson'
>>> bart.score
59

和普通的函數(shù)相比,在類中定義的函數(shù)只有一點(diǎn)不同,就是第一個(gè)參數(shù)永遠(yuǎn)是實(shí)例變量self,并且,調(diào)用時(shí),不用傳遞該參數(shù)。除此之外,類的方法和普通函數(shù)沒(méi)有什么區(qū)別,所以,你仍然可以用默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)。
注意:self代表類的實(shí)例,而非類!

2.實(shí)例屬性和類屬性

屬性有兩種:實(shí)例屬性、類屬性。

實(shí)例屬性是在構(gòu)造函數(shù)init中定義的,定義時(shí)以self為前綴。
類屬性是在類中方法之外定義的。
實(shí)例屬性屬于對(duì)象(實(shí)例),只能在實(shí)例化對(duì)象后通過(guò)對(duì)象名字訪問(wèn)。類屬性屬于類,可直接通過(guò)類名訪問(wèn),不用實(shí)例化對(duì)象(盡管也可以通過(guò)對(duì)象來(lái)訪問(wèn)類屬性,但不建議這樣做,因?yàn)檫@樣做會(huì)導(dǎo)致類屬性值不一致)。類屬性還可以在類定義之后,在程序中通過(guò)類名增加,如:類名.類屬性=值

共有屬性和私有屬性

屬性名以雙下劃線__開頭的則是私有屬性,否則是共有屬性。私有屬性在類外不能直接被訪問(wèn)。但python提供了訪問(wèn)私有屬性的方式,可用于程序的測(cè)試和調(diào)試。方式如下:

對(duì)象名.__類名+私有屬性名字

例如:

class People(object):
    def __init__(self,name,money):
        self.name = name
        self.__money = money

p1 = People('user1', 1000000)
p1.__People__money = 999999 #訪問(wèn)私有屬性并修改~
print(p1.__People__money)

3.類的方法

類的方法:
在類的內(nèi)部,使用 def 關(guān)鍵字來(lái)定義一個(gè)方法,與一般函數(shù)定義不同,類方法必須包含參數(shù) self,且為第一個(gè)參數(shù),self 代表的是類的實(shí)例對(duì)象。
self 的名字并不是規(guī)定不變的(因?yàn)槭切螀?,也可以使用 this,但是最好還是按照約定是用 self。

公有方法和私有方法

公有方法、私有方法都屬于對(duì)象,每個(gè)對(duì)象都有自己的公有方法、私有方法。公有方法通過(guò)對(duì)象名調(diào)用,私有方法則不能通過(guò)對(duì)象名調(diào)用,只能在屬于該對(duì)象的方法中通過(guò)self來(lái)調(diào)用,即只能在類的內(nèi)部調(diào)用 ,不能在類地外部調(diào)用。
兩個(gè)下劃線開頭,聲明該方法為私有方法。公有方法直接是寫一個(gè)方法名即可。

類方法、靜態(tài)方法

1.類方法通過(guò)@classmethod裝飾器實(shí)現(xiàn),類方法和普通方法的區(qū)別是, 類方法只能訪問(wèn)類變量,不能訪問(wèn)實(shí)例變量

class Dog(object):
    def __init__(self,name):
        self.name = name
    @classmethod
    def eat(self):
        print("%s is eating" % self.name)

d = Dog("hahaha")
d.eat()

執(zhí)行報(bào)錯(cuò)如下,說(shuō)Dog沒(méi)有name屬性,因?yàn)閚ame是個(gè)實(shí)例變量,類方法是不能訪問(wèn)實(shí)例變量的

Traceback (most recent call last):
  File "/Users/jieli/PycharmProjects/python_projects/面向?qū)ο?類方法.py", line 9, in 
    d.eat()
  File "/Users/jieli/PycharmProjects/python_projects/面向?qū)ο?類方法.py", line 6, in eat
    print("%s is eating" % self.name)
AttributeError: type object 'Dog' has no attribute 'name'

此時(shí)可以定義一個(gè)類變量,也叫name,看下執(zhí)行效果

class Dog(object):
    name = "hahahahahahaha"
    def __init__(self,name):
        self.name = name
    @classmethod
    def eat(self):
        print("%s is eating" % self.name)

d = Dog("hahaha")
d.eat()

運(yùn)行輸出:
hahahahahahaha is eating

2.通過(guò)@staticmethod裝飾器即可把其裝飾的方法變?yōu)橐粋€(gè)靜態(tài)方法。普通的方法,可以在實(shí)例化后直接調(diào)用,并且在方法里可以通過(guò)self.調(diào)用實(shí)例變量或類變量,但靜態(tài)方法是不可以訪問(wèn)實(shí)例變量或類變量的,一個(gè)不能訪問(wèn)實(shí)例變量和類變量的方法,其實(shí)相當(dāng)于跟類本身已經(jīng)沒(méi)什么關(guān)系了,它與類唯一的關(guān)聯(lián)就是需要通過(guò)類名來(lái)調(diào)用這個(gè)方法

class Dog(object):
    def __init__(self,name):
        self.name = name
    @staticmethod #把eat方法變?yōu)殪o態(tài)方法
    def eat(self):
        print("%s is eating" % self.name)

d = Dog("hahaha")
d.eat()

上面的調(diào)用會(huì)出以下錯(cuò)誤,說(shuō)是eat需要一個(gè)self參數(shù),但調(diào)用時(shí)卻沒(méi)有傳遞,沒(méi)錯(cuò),當(dāng)eat變成靜態(tài)方法后,再通過(guò)實(shí)例調(diào)用時(shí)就不會(huì)自動(dòng)把實(shí)例本身當(dāng)作一個(gè)參數(shù)傳給self了。

Traceback (most recent call last):
  File "/Users/jieli/PycharmProjects/python_projects/面向?qū)ο?靜態(tài)方法.py", line 9, in 
    d.eat()
TypeError: eat() missing 1 required positional argument: 'self'

想讓上面的代碼可以正常工作有兩種辦法

1.調(diào)用時(shí)主動(dòng)傳遞實(shí)例本身給eat方法,即d.eat(d)

class Dog(object):
    def __init__(self,name):
        self.name = name
    @staticmethod #把eat方法變?yōu)殪o態(tài)方法
    def eat(self):
        print("%s is eating" % self.name)

d = Dog("hahaha")
d.eat(d)

運(yùn)行輸出:
hahaha is eating

2.在eat方法中去掉self參數(shù),但這也意味著,在eat中不能通過(guò)self.調(diào)用實(shí)例中的其它變量了

class Dog(object):
    def __init__(self,name):
        self.name = name
    @staticmethod
    def eat():
        print(" is eating")

d = Dog("hahaha")
d.eat()

運(yùn)行輸出:
 is eating
屬性方法  

屬性方法的作用就是通過(guò)@property把一個(gè)方法變成一個(gè)靜態(tài)屬性

class Dog(object):
    def __init__(self,name):
        self.name = name
    @property
    def eat(self):
        print(" %s is eating" %self.name)

d = Dog("hahaha")
d.eat()

調(diào)用會(huì)出以下錯(cuò)誤, 說(shuō)NoneType is not callable, 因?yàn)閑at此時(shí)已經(jīng)變成一個(gè)靜態(tài)屬性了, 不是方法了, 想調(diào)用已經(jīng)不需要加()號(hào)了,直接d.eat就可以了

Traceback (most recent call last):
 ChenRonghua is eating
  File "/Users/jieli/PycharmProjects/python_projects/面向?qū)ο?屬性方法.py", line 8, in 
    d.eat()
TypeError: 'NoneType' object is not callable

正常調(diào)用如下

d = Dog("hahaha")
d.eat

輸出
 hahaha is eating

下一篇博客會(huì)涉及@property的詳細(xì)情況,這里只作簡(jiǎn)介
另外可以參考博客:http://www.cnblogs.com/alex3714/articles/5213184.html

繼承

1.單繼承

顧名思義,單繼承是指子類只繼承一個(gè)父類。

#定義類
class People:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無(wú)法直接進(jìn)行訪問(wèn)
    __weight = 0
    #定義構(gòu)造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說(shuō): 我 %d 歲。" %(self.name,self.age))

#單繼承
class Student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #調(diào)用父類的構(gòu)函
        People.__init__(self,n,a,w)
                #或者用super方法
                #super(People, self).__init__(n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說(shuō): 我 %d 歲了,我在讀 %d 年級(jí)"%(self.name,self.age,self.grade))

s = Student('ken',10,60,3)
s.speak()

2.多繼承

子類同時(shí)繼承多個(gè)父類

#類定義
class People:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無(wú)法直接進(jìn)行訪問(wèn)
    __weight = 0
    #定義構(gòu)造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說(shuō): 我 %d 歲。" %(self.name,self.age))

 #單繼承
 class Student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #調(diào)用父類的構(gòu)函
        People.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說(shuō): 我 %d 歲了,我在讀 %d 年級(jí)"%(self.name,self.age,self.grade))

#另一個(gè)類,多重繼承之前的準(zhǔn)備
class Speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個(gè)演說(shuō)家,我演講的主題是 %s"%(self.name,self.topic))

#多繼承
class Sample(Speaker,Student):
    a =''
    def __init__(self,n,a,w,g,t):
        Student.__init__(self,n,a,w,g)
        Speaker.__init__(self,n,t)

test = Sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默認(rèn)調(diào)用的是在括號(hào)中排前地父類的方法

經(jīng)典類和新式類

  經(jīng)典類的繼承算法: 深度優(yōu)先算法
      新式類的繼承算法: 廣度優(yōu)先算法

python3全部都是新式類
在python2中既有新式類也有經(jīng)典類

  • 在繼承后,通過(guò)子類的對(duì)象調(diào)用某方法,如果子類沒(méi)有, 則去父類找, 如果父類也沒(méi)有, 就報(bào)錯(cuò)。
  • 私有屬性、私有方法, 在類的內(nèi)部都是可以訪問(wèn)的, 類的外部或者子類都不可以訪問(wèn)

多態(tài)

Pyhon 很多語(yǔ)法都是支持多態(tài)的,比如 len(),sorted()等, 你給len傳字符串就返回字符串的長(zhǎng)度,傳列表就返回列表長(zhǎng)度。

關(guān)于多態(tài)的講解,廖雪峰老師的教程里講的很容易理解,這里附上地址:繼承和多態(tài)參考文章
另外附上老男孩Python3教程的面向?qū)ο笾v解,因?yàn)樗詈笾v到了領(lǐng)域模型:傳送門

最后關(guān)于多態(tài),截取廖雪峰老師的一點(diǎn)講解:
靜態(tài)語(yǔ)言 vs 動(dòng)態(tài)語(yǔ)言

對(duì)于靜態(tài)語(yǔ)言(例如Java)來(lái)說(shuō),如果需要傳入Animal類型,則傳入的對(duì)象必須是Animal類型或者它的子類,否則,將無(wú)法調(diào)用run()方法。

對(duì)于Python這樣的動(dòng)態(tài)語(yǔ)言來(lái)說(shuō),則不一定需要傳入Animal類型。我們只需要保證傳入的對(duì)象有一個(gè)run()方法就可以了:

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


當(dāng)前題目:Python學(xué)習(xí)—面向?qū)ο髮W(xué)習(xí)上-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://weahome.cn/article/iiijp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部