【Python进阶】实战Python面向对象基本编程
歡迎來到專欄《Python進階》。在這個專欄中,我們會講述Python的各種進階操作,包括Python對文件、數據的處理,Python各種好用的庫如NumPy、Scipy、Matplotlib、Pandas的使用等等。我們的初心就是帶大家更好的掌握Python這門語言,讓它能為我所用。
今天是《Python進階》專欄的第一期,在本期中,我們將主要介紹Python面向對象的基本理論、類的定義與實例化。
作者&編輯 | 湯興旺?
1 Python面向對象基本理論
在解釋面向對象之前,我們先了解另外一個概念,那就是面向過程。面向過程顧名思義其核心在于過程。也就是解決一個實際問題的步驟,即先干什么,再干什么。舉一個我們平時洗碗的例子,如下圖所示:
從上圖我們看出小明要想完成洗碗這個任務,他面對的是放水、放碗等六個步驟,他需要通過這六步才能更好的完成洗碗任務。
還是這個例子,我們看看如果是面向對象的思想會是一個怎樣的過程。如下圖所示:
通過上圖我們可以看出如果是面向對象的思想,小明要想完成洗碗這個任務,他只要起到一個leader的作用就行,而不是去做具體的事情。即小明面向他的兒子,小明的兒子面向自動洗碗機,而自動洗碗機具體洗碗的過程就不是小明兒子關心的事情了,更不是小明關心的事情了。在這一系列的過程中,其實都是在找這個任務可以由誰來做。
通過上面的例子我相信你已經明白了什么是面向對象了。面向對象的核心就是對象,它實際上是對面向過程的一個封裝,我們需要把自己當成一個leader來審視每一個具體的任務,找到對象,確定對象的屬性和行為,負責好指揮和調度就行,而面向過程的話你就需要完成一個任務的每一個步驟,這樣你會不會累死,哈哈!
2?面向對象-類
2.1 基本概念
從上面的介紹,我們已經理解了什么是面向過程,什么是面向對象。那么我們應該如何在編程中使用面向對象這個思想呢?或者說如何從面向過程的編程思想過渡到面向對象編程的思想呢?具體方法如下:
(1) 列舉出一個任務中具體的實現步驟,也就是面向過程中的那些步驟
(2) 分離(1)中的具體步驟并劃分到某一個對象中
(3) 根據(2)中的對象及對應的行為,抽象出對應的類
(4) 設計類
上面我們提到了一個概念——類。實際上類就是某一個具體對象特征的抽象,是用來描述具有相同的屬性和方法的對象的集合。為了讓大家更好的理解,請看下面一個例子:
小明是個具體的人,他的屬性值和行為值各有三個,我們可以根據小明這個具體的人抽象出優質青年這個類,它是一個抽象化的概念,并不是指一個具體的人。
我們根據這個抽象出來的類,就可以生產具體的對象。
上面的小華、張三、李四就是一個個具體的對象。上面的整個流程如下圖所示:
由一個具體的對象抽象成一個類再實例化成一個具體的對象。
2.2 類的定義與實例化
在Python中,定義類是通過class關鍵字完成的,具體方法如下:
class Student(object):
? ? ? ? pass
從上面我們可以看出class后面緊接著是類名,即Student,類名通常是大寫開頭的單詞,緊接著是(object),表示該類是從哪個類繼承下來的,通常,如果沒有合適的繼承類,就使用object類,這是所有類最終都會繼承的類。
定義好了Student類,就可以根據Student類創建出Student的實例,創建實例是通過類名+()實現的:
Jack = Student()
我們來print(Jack)來看下結果,如下
<__main__.Student object at 0x000001B1B89BA6A0>
我們來解釋下這個輸出,輸出里面的Student就是類,Object是對象,0x000001B1B89BA6A0這個是內存地址,也就是這個類Student實例化后的對象在內存中地址為0x000001B1B89BA6A0。
為什么print(Jack)后的結果是那樣的呢?我們來看下整個流程:
實際上就是通過這個變量找到對象,然后根據對象里面的__class__值找到對應的一個類。我們可以看下Jack的__class__屬性值來驗證下,只需要print(Jack.__class__)即可,輸出如下:
<class '__main__.Student'>
不知道你是否明白了創建對象時的底層運作,歡迎交流!
2.3 類的設計
上面我們講解了如何定義一個類及類的實例化,現在我們講解如何設計一個類。就以利用TensorFlow2.0對圖片數據進行預處理的一個方法來講解。具體代碼如下:
import tensorflow as tf
txtfile=r"D://Learning//tensorflow_2.0//smile//datas//train//train.txt"
def read_txt_file(self):def __init__(self, txt_file, batch_size, num_classes,
? ? ? ? ? ? ? ? image_size, buffer_scale=100):self.read_txt_file()
? ? ? # 轉換成Tensor
?self.img_paths = tf.convert_to_tensor(self.img_paths, dtype=tf.string)def augment_dataset(self, image, size):?def parse_function(self, filename, label):
? ? ? ?img = tf.io.read_file(filename)
? ? ? ?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 = self.augment_dataset(img, self.image_size)
在上面的例子中我們定義了一個ImageData類,類中定義了四個方法分別是__init__()方法、read_txt_file()方法、parse_function()方法和augment_dataset()方法。我們首先來解釋下__init__方法,其實際上可以理解為一個初始化方法,也就是在創建一個對象時會默認被調用,不需要手動調用。但是其他的方法必須要手動的調用,如上面代碼黑色加粗部分。
為了加深對__init__()方法的理解,我們再來看一個簡單的例子,如下:
class AiLearning():
上面的輸出很簡單就是yousanai。那如果不是__init__方法,結果會怎樣呢?
class Ai_Learning():
這個輸出程序會報錯,會顯示AttributeError: 'Ai_Learning' object has no attribute 'a'。即沒有屬性a。我們需要將代碼改成下面的代碼,才能正確輸出,我們所做的改動就是手動調用了Learning()方法。
class Ai_Learning():
我相信通過上面的講解你已經明白了如何來設計一個類了。
總結
本期我們介紹了Python面向對象的思想及其基本概念,也介紹了如何定義一個類、創建一個對象和設計一個類,并介紹了創建對象時的底層運作機制。希望您能更好的掌握面向對象的思想。
下期預告:Python文件操作
有三AI編程微信公眾號《三人行ToCode》
有三AI編程方面的微信公眾號《三人行ToCode》創建了,歡迎加入,希望大家能借助這個平臺,扎實自己的編程基礎。
轉載文章請后臺聯系
侵權必究
往期精選
【Python進階】Python進階專欄、編程與開源框架知識星球上線,等你來follow
【雜談】菜鳥誤入linux會有哪些慘痛的經歷
【TensorFlow2.0】TensorFlow2.0專欄上線,你來嗎?
【TensorFlow2.0】以后我們再也離不開Keras了?
【TensorFlow2.0】數據讀取與使用方式
【TensorFlow2.0】如何搭建網絡模型
總結
以上是生活随笔為你收集整理的【Python进阶】实战Python面向对象基本编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【强化学习】从强化学习基础概念开始
- 下一篇: 【Python进阶】Python进阶专栏