中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

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

開通VIP
python中的面向?qū)ο缶幊?/div>

歡迎來到專欄《Python進(jìn)階》。在這個(gè)專欄中,我們會(huì)講述Python的各種進(jìn)階操作,包括Python對(duì)文件、數(shù)據(jù)的處理,Python各種好用的庫(kù)如NumPy、Scipy、Matplotlib、Pandas的使用等等。我們的初心就是帶大家更好的掌握Python這門語言,讓它能為我所用。

今天是《Python進(jìn)階》專欄的第一期,在本期中,我們將主要介紹Python面向?qū)ο蟮幕纠碚?、類的定義與實(shí)例化。

作者 | 湯興旺

編輯 | 言有三

1 Python面向?qū)ο蠡纠碚?/strong>

在解釋面向?qū)ο笾?,我們先了解另外一個(gè)概念,那就是面向過程。面向過程顧名思義其核心在于過程。也就是解決一個(gè)實(shí)際問題的步驟,即先干什么,再干什么。舉一個(gè)我們平時(shí)洗碗的例子,如下圖所示:

從上圖我們看出小明要想完成洗碗這個(gè)任務(wù),他面對(duì)的是放水、放碗等六個(gè)步驟,他需要通過這六步才能更好的完成洗碗任務(wù)。

還是這個(gè)例子,我們看看如果是面向?qū)ο蟮乃枷霑?huì)是一個(gè)怎樣的過程。如下圖所示:

通過上圖我們可以看出如果是面向?qū)ο蟮乃枷?,小明要想完成洗碗這個(gè)任務(wù),他只要起到一個(gè)leader的作用就行,而不是去做具體的事情。即小明面向他的兒子,小明的兒子面向自動(dòng)洗碗機(jī),而自動(dòng)洗碗機(jī)具體洗碗的過程就不是小明兒子關(guān)心的事情了,更不是小明關(guān)心的事情了。在這一系列的過程中,其實(shí)都是在找這個(gè)任務(wù)可以由誰來做。

通過上面的例子我相信你已經(jīng)明白了什么是面向?qū)ο罅?。面向?qū)ο蟮暮诵木褪菍?duì)象,它實(shí)際上是對(duì)面向過程的一個(gè)封裝,我們需要把自己當(dāng)成一個(gè)leader來審視每一個(gè)具體的任務(wù),找到對(duì)象,確定對(duì)象的屬性和行為,負(fù)責(zé)好指揮和調(diào)度就行,而面向過程的話你就需要完成一個(gè)任務(wù)的每一個(gè)步驟,這樣你會(huì)不會(huì)累死,哈哈!

2 面向?qū)ο?類

2.1 基本概念

從上面的介紹,我們已經(jīng)理解了什么是面向過程,什么是面向?qū)ο?。那么我們?yīng)該如何在編程中使用面向?qū)ο筮@個(gè)思想呢?或者說如何從面向過程的編程思想過渡到面向?qū)ο缶幊痰乃枷肽??具體方法如下:

(1) 列舉出一個(gè)任務(wù)中具體的實(shí)現(xiàn)步驟,也就是面向過程中的那些步驟

(2) 分離(1)中的具體步驟并劃分到某一個(gè)對(duì)象中

(3) 根據(jù)(2)中的對(duì)象及對(duì)應(yīng)的行為,抽象出對(duì)應(yīng)的類

(4) 設(shè)計(jì)類

上面我們提到了一個(gè)概念——類。實(shí)際上類就是某一個(gè)具體對(duì)象特征的抽象,是用來描述具有相同的屬性和方法的對(duì)象的集合。為了讓大家更好的理解,請(qǐng)看下面一個(gè)例子:

小明是個(gè)具體的人,他的屬性值和行為值各有三個(gè),我們可以根據(jù)小明這個(gè)具體的人抽象出優(yōu)質(zhì)青年這個(gè)類,它是一個(gè)抽象化的概念,并不是指一個(gè)具體的人。

我們根據(jù)這個(gè)抽象出來的類,就可以生產(chǎn)具體的對(duì)象。

上面的小華、張三、李四就是一個(gè)個(gè)具體的對(duì)象。上面的整個(gè)流程如下圖所示:

由一個(gè)具體的對(duì)象抽象成一個(gè)類再實(shí)例化成一個(gè)具體的對(duì)象。

2.2 類的定義與實(shí)例化

在Python中,定義類是通過class關(guān)鍵字完成的,具體方法如下:

class Student(object): pass

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

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

Jack = Student()

我們來print(Jack)來看下結(jié)果,如下

<__main__.Student object at 0x000001B1B89BA6A0>

我們來解釋下這個(gè)輸出,輸出里面的Student就是類,Object是對(duì)象,0x000001B1B89BA6A0這個(gè)是內(nèi)存地址,也就是這個(gè)類Student實(shí)例化后的對(duì)象在內(nèi)存中地址為0x000001B1B89BA6A0。

為什么print(Jack)后的結(jié)果是那樣的呢?我們來看下整個(gè)流程:

實(shí)際上就是通過這個(gè)變量找到對(duì)象,然后根據(jù)對(duì)象里面的__class__值找到對(duì)應(yīng)的一個(gè)類。我們可以看下Jack的__class__屬性值來驗(yàn)證下,只需要print(Jack.__class__)即可,輸出如下:

<class '__main__.Student'>

不知道你是否明白了創(chuàng)建對(duì)象時(shí)的底層運(yùn)作,歡迎交流!

2.3 類的設(shè)計(jì)

上面我們講解了如何定義一個(gè)類及類的實(shí)例化,現(xiàn)在我們講解如何設(shè)計(jì)一個(gè)類。就以利用TensorFlow2.0對(duì)圖片數(shù)據(jù)進(jìn)行預(yù)處理的一個(gè)方法來講解。具體代碼如下:

import tensorflow as tftxtfile=r'D://Learning//tensorflow_2.0//smile//datas//train//train.txt'batch_size = 64num_classes = 2image_size = (48,48)class ImageData: def read_txt_file(self): self.img_paths = [] self.labels = [] for line in open(self.txt_file, 'r'): items = line.split(' ') self.img_paths.append(items[0]) self.labels.append(int(items[1])) def __init__(self, txt_file, batch_size, num_classes, image_size, buffer_scale=100): self.image_size = image_size self.batch_size = batch_size self.txt_file = txt_file  self.num_classes = num_classes buffer_size = batch_size * buffer_scale # 讀取圖片 self.read_txt_file() self.dataset_size = len(self.labels) print('num of train datas=', self.dataset_size) # 轉(zhuǎn)換成Tensor self.img_paths = tf.convert_to_tensor(self.img_paths, dtype=tf.string) self.labels = tf.convert_to_tensor(self.labels, dtype=tf.int32) # 創(chuàng)建數(shù)據(jù)集 data = tf.data.Dataset.from_tensor_slices((self.img_paths, self.labels)) print('data type=', type(data)) data = data.map(self.parse_function) data = data.repeat(1000) data = data.shuffle(buffer_size=buffer_size) # 設(shè)置self data Batch self.data = data.batch(batch_size) print('self.data type=', type(self.data)) def augment_dataset(self, image, size): distorted_image = tf.image.random_brightness(image, max_delta=63) distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8) float_image = tf.image.per_image_standardization(distorted_image) return float_image def parse_function(self, filename, label): label_ = tf.one_hot(label, self.num_classes) img = tf.io.read_file(filename) img = tf.image.decode_jpeg(img, channels=3) img = tf.image.convert_image_dtype(img, dtype=tf.float32) img=tf.image.random_crop(img, [self.image_size[0], self.image_size[1], 3]) img = tf.image.random_flip_left_right(img) img = self.augment_dataset(img, self.image_size) return img, label_ dataset = ImageData(txtfile, batch_size, num_classes, image_size)

在上面的例子中我們定義了一個(gè)ImageData類,類中定義了四個(gè)方法分別是__init__()方法、read_txt_file()方法、parse_function()方法和augment_dataset()方法。我們首先來解釋下__init__方法,其實(shí)際上可以理解為一個(gè)初始化方法,也就是在創(chuàng)建一個(gè)對(duì)象時(shí)會(huì)默認(rèn)被調(diào)用,不需要手動(dòng)調(diào)用。但是其他的方法必須要手動(dòng)的調(diào)用,如上面代碼黑色加粗部分。

為了加深對(duì)__init__()方法的理解,我們?cè)賮砜匆粋€(gè)簡(jiǎn)單的例子,如下:

class AiLearning(): def __init__(self): self.a = 'yousanai'd = AiLearning()print(d.a)

上面的輸出很簡(jiǎn)單就是yousanai。那如果不是__init__方法,結(jié)果會(huì)怎樣呢?

class Ai_Learning(): def Learning(self): self.a = 'yousanai'd = Ai_Learning()print(d.a)

這個(gè)輸出程序會(huì)報(bào)錯(cuò),會(huì)顯示AttributeError: 'Ai_Learning' object has no attribute 'a'。即沒有屬性a。我們需要將代碼改成下面的代碼,才能正確輸出,我們所做的改動(dòng)就是手動(dòng)調(diào)用了Learning()方法。

class Ai_Learning(): def Learning(self): self.a = 'yousanai' return self.ad = Ai_Learning()print(d.Learning())

我相信通過上面的講解你已經(jīng)明白了如何來設(shè)計(jì)一個(gè)類了。

總結(jié)

本期我們介紹了Python面向?qū)ο蟮乃枷爰捌浠靖拍?,也介紹了如何定義一個(gè)類、創(chuàng)建一個(gè)對(duì)象和設(shè)計(jì)一個(gè)類,并介紹了創(chuàng)建對(duì)象時(shí)的底層運(yùn)作機(jī)制。希望您能更好的掌握面向?qū)ο蟮乃枷搿?/p>

下期預(yù)告:Python文件操作

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服