国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
面向?qū)ο笫沁M(jìn)階非常重要的一環(huán)!給我五分鐘讓你完全掌握!

過(guò)程和函數(shù):過(guò)程類(lèi)似于函數(shù),只能執(zhí)行,但是沒(méi)有返回結(jié)果;函數(shù)不僅能執(zhí)行,還能返回結(jié)果。

面向過(guò)程和面向?qū)ο?基本概念

面向過(guò)程-怎么做

  • 把完成某一個(gè)需求的所有步驟從頭到尾逐步實(shí)現(xiàn);
  • 根據(jù)開(kāi)發(fā)需求,將某些功能獨(dú)立的代碼封裝成一個(gè)又一個(gè)函數(shù);
  • 最后完成的代碼,就是順序的調(diào)用不同的函數(shù)。

特點(diǎn)

  • 注重步驟和過(guò)程,不注重職責(zé)分工;
  • 如果復(fù)雜需求,代碼會(huì)變得很復(fù)雜;
  • 開(kāi)發(fā)復(fù)雜項(xiàng)目,沒(méi)有固定的套路,開(kāi)發(fā)難度很大。

面向?qū)ο?誰(shuí)來(lái)做

相比較函數(shù),面向?qū)ο笫歉蟮姆庋b,根據(jù)職責(zé)在一個(gè)對(duì)象中封裝多個(gè)方法。

  1. 在完成某一個(gè)需求前,首先確定職責(zé)-要做的事情(方法)
  2. 根據(jù)職責(zé)確定不同的對(duì)象,在對(duì)象內(nèi)部封裝不同的多個(gè)方法
  3. 最后完成的代碼,就是順序的讓不同的對(duì)象調(diào)用不同的方法。

特點(diǎn)

  • 注重對(duì)象和職責(zé),不同的對(duì)象承擔(dān)不同的職責(zé);
  • 更加適合應(yīng)對(duì)復(fù)雜的需求變化,是專(zhuān)門(mén)應(yīng)對(duì)復(fù)雜項(xiàng)目開(kāi)發(fā),提供的固定套路;
  • 需要在面向過(guò)程基礎(chǔ)上,再學(xué)習(xí)一些面向?qū)ο蟮恼Z(yǔ)法。
  • 將數(shù)據(jù)與函數(shù)綁定到一起,進(jìn)行封裝,這樣能夠更快速的開(kāi)發(fā)程序,減少了重復(fù)代碼的重寫(xiě)過(guò)程

面向?qū)ο笫腔诿嫦蜻^(guò)程的

用面向?qū)ο蟮乃季S解決問(wèn)題的重點(diǎn)

當(dāng)遇到一個(gè)需求的時(shí)候不用自己去實(shí)現(xiàn),如果自己一步步實(shí)現(xiàn)那就是面向過(guò)程;應(yīng)該找一個(gè)專(zhuān)門(mén)做這個(gè)事的人來(lái)做。

面向?qū)ο?object-oriented ;簡(jiǎn)稱(chēng): OO) 至今還沒(méi)有統(tǒng)一的概念 我們可以把它定義為: 按人們 認(rèn)識(shí)客觀(guān)世界的系統(tǒng)思維方式,采用基于對(duì)象(實(shí)體) 的概念建立模型,模擬客觀(guān)世界分析、設(shè) 計(jì)、實(shí)現(xiàn)軟件的辦法。

面向?qū)ο缶幊?Object Oriented Programming-OOP) 是一種解決軟件復(fù)用的設(shè)計(jì)和編程方法。 這種方法把軟件系統(tǒng)中相近相似的操作邏輯和操作 應(yīng)用數(shù)據(jù)、狀態(tài),以類(lèi)的型式描述出來(lái),以對(duì)象實(shí)例的形式在軟件系統(tǒng)中復(fù)用,以達(dá)到提高軟件開(kāi)發(fā)效率的作用。

Python學(xué)習(xí)交流群:1004391443,這里是python學(xué)習(xí)者聚集地,有大牛答疑,有資源共享!小編也準(zhǔn)備了一份python學(xué)習(xí)資料,有想學(xué)習(xí)python編程的,或是轉(zhuǎn)行,或是大學(xué)生,還有工作中想提升自己能力的,正在學(xué)習(xí)的小伙伴歡迎加入學(xué)習(xí)。

類(lèi)和對(duì)象

類(lèi)和對(duì)象的概念

類(lèi)

類(lèi)是對(duì)一群具有相同特征或者行為的事物的一個(gè)統(tǒng)稱(chēng),是抽象的,不能直接使用;

特征被稱(chēng)為屬性;

行為被稱(chēng)為方法。

對(duì)象

對(duì)象是由類(lèi)創(chuàng)建出來(lái)的一個(gè)具體存在,可以直接使用;

由哪一個(gè)類(lèi)創(chuàng)建出來(lái)的對(duì)象,該對(duì)象就具有在那一個(gè)類(lèi)中定義的屬性和方法;

類(lèi)和對(duì)象的關(guān)系

類(lèi)就是創(chuàng)建對(duì)象的模板,應(yīng)該先有類(lèi),在有對(duì)象;

一個(gè)類(lèi)可以創(chuàng)建多個(gè)對(duì)象,不同對(duì)象之間屬性可能各不相同;

類(lèi)中定義了什么方法,對(duì)象中就有什么屬性和方法,不可能少,但可能多,因?yàn)閷?duì)象可以自己在類(lèi)外增加屬性

類(lèi)的設(shè)計(jì)

在使用面向?qū)ο箝_(kāi)發(fā)前,應(yīng)該首先分析需求,確定一下,程序中需要包含哪些類(lèi)。

在程序開(kāi)發(fā)中,要設(shè)計(jì)一個(gè)類(lèi),通常要滿(mǎn)足以下三個(gè)要素

  1. 類(lèi)名 這類(lèi)事物的名字,滿(mǎn)足大駝峰命名法;
  2. 屬性 這類(lèi)事物具有什么樣的特征;
  3. 方法 這類(lèi)事物具有什么樣的行為

屬性和方法的確定

對(duì) 對(duì)象的特征描述,通常可以定義為屬性

對(duì)象具有的行為,通??梢远x為方法

面向?qū)ο蠡A(chǔ)語(yǔ)法

dir內(nèi)置函數(shù)

在Python中對(duì)象幾乎是無(wú)所不在的,我們之前學(xué)習(xí)的變量,數(shù)據(jù),函數(shù)都是對(duì)象;

在Python中可以使用以下兩個(gè)方法驗(yàn)證:

  1. 在標(biāo)識(shí)符/數(shù)據(jù)后輸入一個(gè). ,然后按下tab鍵,ipython會(huì)提示該對(duì)象能夠調(diào)用的方法列表;
  2. 使用內(nèi)置函數(shù)dir傳入標(biāo)識(shí)符/數(shù)據(jù),可以查看對(duì)象內(nèi)的所有屬性和方法;

部分內(nèi)置方法說(shuō)明

?

image

在交互式下:

def demo(): '''這是一個(gè)測(cè)試函數(shù)''' print('hello python')dir(demo)['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']demo.__doc__'這是一個(gè)測(cè)試函數(shù)'

定義簡(jiǎn)單的類(lèi)

面向?qū)ο笫歉蟮姆庋b,在一個(gè)類(lèi)中封裝多個(gè)方法,這樣通過(guò)這個(gè)類(lèi)創(chuàng)建出來(lái)的對(duì)象,就可以直接調(diào)用這些方法了。

定義只包含方法的類(lèi)

在python中藥定義一個(gè)只包含方法的類(lèi),語(yǔ)法格式如下:

class 類(lèi)名: def 方法1(self, 列表參數(shù)): pass def 方法2(self, 列表參數(shù)): pass

方法的定義格式和之前學(xué)習(xí)的函數(shù)幾乎一樣;

區(qū)別在于第一個(gè)參數(shù)必須是self;

注意,類(lèi)名的命名規(guī)則要符合大駝峰命名法;

創(chuàng)建對(duì)象

當(dāng)一個(gè)類(lèi)定義完成后,要使用這個(gè)類(lèi)來(lái)創(chuàng)建對(duì)象,語(yǔ)法格式如下:

對(duì)象變量 = 類(lèi)名()

第一個(gè)面向?qū)ο蟪绦?/p>

class Cat: '''定義一個(gè)貓類(lèi)''' def eat(self): print('小貓愛(ài)吃魚(yú)') def drink(self): print('小貓要喝水')tom = Cat()tom.eat()tom.drink()

引用概念的強(qiáng)調(diào)

  • 在面向?qū)ο箝_(kāi)發(fā)中,引用的概念是同樣使用的。
  • 在python中使用類(lèi)創(chuàng)建對(duì)象之后,tom變量仍然記錄的是對(duì)象在內(nèi)存中的地址,也就是tom變量引用了新建的貓對(duì)象;
  • 使用print函數(shù)輸出對(duì)象變量,可以輸出這個(gè)變量引用的對(duì)象是由哪一個(gè)類(lèi)創(chuàng)建的對(duì)象,以及在內(nèi)存中的地址(十六進(jìn)制)

Python學(xué)習(xí)交流群:556370268,這里是python學(xué)習(xí)者聚集地,有大牛答疑,有資源共享!小編也準(zhǔn)備了一份python學(xué)習(xí)資料,有想學(xué)習(xí)python編程的,或是轉(zhuǎn)行,或是大學(xué)生,還有工作中想提升自己能力的,正在學(xué)習(xí)的小伙伴歡迎加入學(xué)習(xí)。

驗(yàn)證引用示例

class Cat: '''定義一個(gè)貓類(lèi)''' def eat(self): print('小貓愛(ài)吃魚(yú)') def drink(self): print('小貓要喝水')tom = Cat()tom.eat()tom.drink()print(tom) # <__main__.Cat object at 0x0000019D74C30C18>addr = id(tom)print('%d' % addr) # 以十進(jìn)制表示地址 1775780432920print('%x' % addr) # 以十六進(jìn)制表示地址 19d74c30c18

一個(gè)類(lèi)創(chuàng)建多個(gè)對(duì)象 示例

class Cat: '''定義一個(gè)貓類(lèi)''' def eat(self): print('小貓愛(ài)吃魚(yú)') def drink(self): print('小貓要喝水')tom = Cat()bosi = Cat()bosi2 = bosiprint(tom) # <__main__.Cat object at 0x000001A4A0B1FB70>print(bosi) # <__main__.Cat object at 0x000001A4A0B1FC50>print(bosi2) # <__main__.Cat object at 0x000001A4A0B1FC50>

方法中的self函數(shù)

在類(lèi)外給對(duì)象附加屬性

  • 不修改類(lèi),在類(lèi)外給對(duì)象增加屬性;但不建議這樣使用,因?yàn)閷?duì)象屬性的封裝應(yīng)該封裝在類(lèi)的內(nèi)部。
  • 類(lèi)外增加屬性方法:在類(lèi)的外部的代碼中直接通過(guò) 對(duì)象變量. 設(shè)置一個(gè)屬性即可;

類(lèi)外給對(duì)象附加屬性示例

class Cat:'''定義一個(gè)貓類(lèi)'''def eat(self): print('小貓愛(ài)吃魚(yú)')def drink(self): print('小貓要喝水')tom = Cat()tom.name = '湯姆'bosi = Cat()bosi.name = '波斯'

利用self 在 類(lèi)封裝的方法中 輸出對(duì)象屬性

由哪一個(gè)對(duì)象調(diào)用的方法,方法內(nèi)的self就是哪一個(gè)對(duì)象的引用;

在類(lèi)封裝的方法內(nèi)部,self就表示當(dāng)前調(diào)用方法的對(duì)象自己;

調(diào)用方法時(shí),不需要傳遞self參數(shù);

在類(lèi)的外部,通過(guò)變量名. 訪(fǎng)問(wèn)對(duì)象的屬性和方法;

在類(lèi)封裝的方法內(nèi)部中,通過(guò)self. 訪(fǎng)問(wèn)對(duì)象的屬性和方法。

class Cat: '''定義一個(gè)貓類(lèi)''' # 哪一個(gè)對(duì)象調(diào)用的方法,方法內(nèi)的self就是哪一個(gè)對(duì)象的引用 def eat(self): print('%s愛(ài)吃魚(yú)' % self.name) def drink(self): print('%s要喝水' % self.name)tom = Cat()tom.name = '湯姆'tom.eat()tom.drink()bosi = Cat()bosi.name = '波斯'bosi.eat()bosi.drink()# 湯姆愛(ài)吃魚(yú)# 湯姆要喝水# 波斯愛(ài)吃魚(yú)# 波斯要喝水

在類(lèi)外給對(duì)象增加屬性的問(wèn)題

如果是在調(diào)用方法之后,才設(shè)置的屬性,并且調(diào)用的方法要用到屬性,那么就會(huì)報(bào)錯(cuò)。

class Cat: '''定義一個(gè)貓類(lèi)''' # 哪一個(gè)對(duì)象調(diào)用的方法,方法內(nèi)的self就是哪一個(gè)對(duì)象的引用 def eat(self): print('%s愛(ài)吃魚(yú)' % self.name) def drink(self): print('%s要喝水' % self.name)tom = Cat()tom.eat() # 報(bào)錯(cuò)tom.drink() # 報(bào)錯(cuò)tom.name = '湯姆'

因此,在日常開(kāi)發(fā)中,不推薦在類(lèi)的外部給對(duì)象增加屬性;

對(duì)象應(yīng)該包含有哪些屬性,應(yīng)該封裝在類(lèi)的內(nèi)部。

初始化方法

當(dāng)使用 類(lèi)名()創(chuàng)建對(duì)象時(shí),會(huì)自動(dòng)執(zhí)行以下操作:

  1. 為對(duì)象在內(nèi)存中分配空間--創(chuàng)建對(duì)象;
  2. 為對(duì)象的屬性 設(shè)置初始值--初始化方法(init);

這個(gè)初始化方法就是 init 方法, init 是對(duì)象的內(nèi)置方法;

init方法是專(zhuān)門(mén)用來(lái)定義一個(gè)類(lèi)具有哪些屬性的方法;

在我們用類(lèi)創(chuàng)建一個(gè)對(duì)象時(shí),如果類(lèi)中有初始化方法,會(huì)自動(dòng)調(diào)用初始化方法。

例如以下代碼,當(dāng)我們創(chuàng)建對(duì)象時(shí),就算不調(diào)用方法,也會(huì)輸出 “初始化方法”。

class Cat: def __init__(self): print('初始化方法')tom = Cat() # 初始化方法

在初始化方法中定義屬性

init 方法內(nèi)部使用 self.屬性名 = 屬性的初始值 就可以定義屬性;

定義屬性后,再使用Cat類(lèi)創(chuàng)建的對(duì)象,都會(huì)擁有該屬性;

class Cat: def __init__(self): print('初始化方法') # self.屬性名 = 屬性的初始值 self.name = '湯姆' def eat(self): print('%s愛(ài)吃魚(yú)' % self.name)tom = Cat()print(tom.name)

使用參數(shù)設(shè)置屬性初始值

在開(kāi)發(fā)中,如果希望創(chuàng)建對(duì)象的同時(shí),就設(shè)置對(duì)象的屬性,可以對(duì) init 方法進(jìn)行改進(jìn)。

  1. 把希望設(shè)置的屬性,定義成 init 方法的參數(shù)
  2. 在方法內(nèi)部使用self.屬性名 = 形參 接收外部傳遞的參數(shù)
  3. 在創(chuàng)建對(duì)象時(shí),使用類(lèi)名(屬性1,屬性2,...)調(diào)用

參數(shù)設(shè)置屬性初始值示例

class Cat: def __init__(self, new_name): # self.屬性名 = 形參 self.name = new_name def eat(self): print('%s愛(ài)吃魚(yú)' % self.name)tom = Cat('湯姆')tom.eat()bosi = Cat('波斯')bosi.eat()# 湯姆愛(ài)吃魚(yú)# 波斯愛(ài)吃魚(yú)

內(nèi)置方法和屬性

del方法

del 方法 會(huì)在 執(zhí)行完所有代碼后系統(tǒng)自動(dòng)銷(xiāo)毀對(duì)象變量;

因?yàn)閠om是全局對(duì)象,所以正常運(yùn)行時(shí) 會(huì)在所有代碼結(jié)束后自動(dòng)調(diào)用 del 方法;

如果使用了del關(guān)鍵字刪除tom的全局變量,則會(huì)在執(zhí)行del tom前 就會(huì)自動(dòng)調(diào)用 del 方法銷(xiāo)毀對(duì)象內(nèi)存;

應(yīng)用場(chǎng)景

init改造初始化方法,可以讓創(chuàng)建對(duì)象更加靈活;

del如果希望在對(duì)象被銷(xiāo)毀前,再做一些事情,可以考慮使用 del 方法;

生命周期

一個(gè)對(duì)象從調(diào)用 類(lèi)名()創(chuàng)建對(duì)象,生命周期開(kāi)始;

一個(gè)對(duì)象的 del 方法一旦被調(diào)用,生命周期結(jié)束;

在對(duì)象的生命周期之內(nèi),可以訪(fǎng)問(wèn)對(duì)象屬性,或者讓對(duì)象調(diào)用方法。

class Cat: def __init__(self, new_name): # self.屬性名 = 屬性的初始值 self.name = new_name print('%s init' % self.name) def __del__(self): print('%s del' % self.name) def eat(self): print('%s愛(ài)吃魚(yú)' % self.name)tom = Cat('湯姆')tom.eat()print('-'*50)# 湯姆 init# 湯姆愛(ài)吃魚(yú)# --------------------------------------------------# 湯姆 del

沒(méi)執(zhí)行完所有代碼就刪除tom對(duì)象

class Cat: def __init__(self, new_name): # self.屬性名 = 屬性的初始值 self.name = new_name print('%s init' % self.name) def __del__(self): print('%s del' % self.name) def eat(self): print('%s愛(ài)吃魚(yú)' % self.name)# tom 是一個(gè)全局變量tom = Cat('湯姆')tom.eat()# 因?yàn)樵趫?zhí)行完所有代碼之前,全局變量tom就被刪除了,所以會(huì)自動(dòng)調(diào)用__del__方法,不會(huì)等-*50的執(zhí)行del tomprint('-'*50)# 湯姆 init# 湯姆愛(ài)吃魚(yú)# 湯姆 del# --------------------------------------------------

str方法

print(變量對(duì)象) 默認(rèn)看到父類(lèi)和變量對(duì)象的內(nèi)存地址,但 我們可以通過(guò) str 方法來(lái)自定義看到的內(nèi)容

注意, str 方法必須要返回一個(gè)字符串。

class Cat: def __init__(self, new_name): # self.屬性名 = 形參 self.name = new_name def __str__(self): return '<object_name>-<%s>' % self.name def eat(self): print('%s愛(ài)吃魚(yú)' % self.name)# tom 是一個(gè)全局變量tom = Cat('湯姆')tom.eat()print(tom)# 湯姆愛(ài)吃魚(yú)# <object_name>-<湯姆>

身份運(yùn)算符is

身份運(yùn)算符介紹

身份運(yùn)算符用于比較兩個(gè)對(duì)象的內(nèi)存地址是否一致--是否是對(duì)同一個(gè)對(duì)象的引用;

注意,在python中針對(duì)None比較時(shí),建議使用is判斷;

身份運(yùn)算符表

?

image

is和==的區(qū)別

is用于判斷兩個(gè)變量引用對(duì)象是否是同一個(gè);

==用于判斷引用變量的值是否相等;

a = [1, 2, 3]b = [1, 2]b.append(3)a is b # Falsea ==b # True

當(dāng)在判斷None時(shí),建議使用is判斷;

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
趣味解讀Python面向?qū)ο缶幊?(類(lèi)和對(duì)象)
python 基礎(chǔ)(五)
第12關(guān)、我們都是中國(guó)人
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服