|Python新手小白中級教程|第二十八章:面向對象編程(類定義語法私有屬性類的繼承與多態)(4)

文章目錄

  • 前言
  • 一、類定義語法
  • 二、私有方法和私有屬性
    • 1.私有屬性
    • 2.私有方法
  • 三、類“繼承”
    • 1.初識繼承
    • 2.使用super函數調用父類中構造的東西
  • 四、類“多態”
    • 1.多態基礎
    • 2.子類不同形態
    • 3.使用isinstance函數與多態結合判斷類型
  • 總結

前言

大家好,我是BoBo仔吖,上3節課我們學習了類的基礎知識。這節課,我們要講一些深入的東西。
是什么呢?看看就知道!

一、類定義語法

其實,我們學習的class類都可以看做我們定義的功能語法
之前我講解type函數的時候也說到了我們的牢大class
這是我們的文章
https://blog.csdn.net/m0_69481332/article/details/138410028?spm=1001.2014.3001.5501
這里有一個內容要注意:
在這里插入圖片描述
這幅圖片我給大家扣過來了,大家會發現:這里我們通過type函數判斷類型后(其實,list等等也是一個類哦),下面的輸出是<class'類型'>
大家是不是也看看讓自己的類的語法形式?使用type方法即可!

還是有栗子:
在這里插入圖片描述
這是我們上次的例子
我們都知道,我們把類GameB賦予了變量game_begin
所以,我們用type來檢驗它的時候便反映了它的類語法形式,也就是GameB
這里還有一個main

<class '__main__.GameB'>

這里出現了__main__方法,因為這是我們自己定義的類語法空間

這就是類定義語法,非常簡單似不似?
接下來,我們學習一些更加深入的內容

二、私有方法和私有屬性

1.私有屬性

我們還是把我們之前的例子拿出來

class GameB:def __init__(self,exp,grade):self.exp = expself.grade = gradedef print_message(self):print('經驗值',self.exp)print('等級',self.grade)game_begin = GameB('0',1)
game_begin.print_message()
print(type(game_begin))

這里我們把class GameB的設定叫做定義類,而其中的函數則稱為方法
為什么要扯概念?因為這個東東非常重要

接下來,我們來講一個和上文一點不搭噶的東西

class Dog:def __init__(self,name):self.__name = nameself.__age = Noneprint(self.__name,'生成成功!')def set_age(self,age):if not isinstance(age,int):#這里的函數isinstance是判斷它括號內的兩個參數中,參數1是否是參數2的類型,如果不是就執行下面的操作,通常作為條件使用print('輸入的年齡必須是數字!')return Falseif age <= 0:print('年齡必須大于0!')return Falseself.__age = agedef play(self):print('汪汪汪!我今年',self.__age)dog =Dog('旺財')
dog.set_age('hello!')
dog.set_age(-20)
dog.set_age(3)
dog.play()

這是一個生成dog角色的函數,這里我們發現有一個非常眼生的東西:私有屬性
私有屬性的屬性呢和他的本身命名的特性差不多,是一個“私有”屬性
大家可以把私有屬性看做一件事情:
我們在家里可能穿睡衣,穿拖鞋;但是,我們在外面就不會穿的這么奇怪
我們就可以把家里看做class類里,外面看做class類外的代碼,這樣大家是不是就理解多了呢?

這里的結構是__(下劃線×2)對象名
這個私有屬性呢與我們普通的屬性有一個顯著的特點就是他不能直接改動,而是需要在某個特定的函數中再次修改,且不能再類以外的地方調用
例如這里,我們構造了兩個私有屬性,它們是__age__name
屬性age只能通過類中的set_age修改,不能再外部直接改動,否則會發生錯誤
就像這樣:
在這里插入圖片描述
當然,有私有屬性就有私有方法

2.私有方法

這里的方法概念上面提到了,就是我們所封裝的函數
私有方法的理解也可以向上文那樣:你在家里休息日時可能9點起,12點睡,打游戲,吃KFC;但是,你上學或是工作時就必須早起,調整作息。
我們還是把家看做類代碼,把外面看做類以外的代碼

我們還是以類Dog為例,構造私有方法__say(self,name)
代碼如下:

class Dog:def __say(self,name):print(name)def play(self):print('汪汪汪!')dog = Dog()
dog.play()

這里我們的私有方法沒有起任何作用
而且,這里不能通過類以外區域來修改這個函數,否則會出現錯誤

大家學會私有概念了嗎?如果學會,那么你的類使用就更加靈活咯!!!

三、類“繼承”

繼承呢我們往往會聯想到一些時間:老父親的特征往往會繼承給兒女,這就是生理繼承(DNA繼承)
這種廣義上的繼承想必大家都知道,那么,在類里,繼承是什么一種概念呢?
還是甩出剛剛的示例,就是那個生成doggy的模型
這里我們看源代碼,看看有什么相同和不同

1.初識繼承

class Animal:def __init__(self,name):self.name = name def play(self):print('我是',self.name)class Dog(Animal):#注意看,這就是繼承的格式!!pass#這里我們沒有私有方法,所以這里我們在下面調用的時候調整就可以了dog = Dog('旺財')#這里繼承了Animal類中的方法,賦給dog之后,就可以轉而通過Dog類調用Animal的內容
dog.play()

這里我們的繼承類采用的是這樣的格式:

class 類名【子類】(主類名【或者叫父類】):

我們通過繼承的手法可以更加靈活地使用父類里的東西,而且還能修改(私有屬性或私有方法除外,不可繼承),更加靈活。這里我們的父類Animal受了Dog的調用,如果我們在dog里修改animal類,那么效果會更加良好

2.使用super函數調用父類中構造的東西

class Animal:def __init__(self,name):self.name = namedef play(self):print('我是',self.name)class Dog(Animal):def __init__(self):print('旺財')dog = Dog()

在這個例子里,我們在dog類中繼承了Animal,但是由于沒有調用play,所以只能輸出旺財

但是,我們如果直接使用方法play,那么就會出錯,因為我們使用的是類Dog里的構造方法,而不是類Animal的構造方法,盡管我們繼承了Animal類
如果我們要實現animal類的構造方法,那么我們就要用到super() 內置函數

就像這樣:

class Animal:def __init__(self, name):self.name = namedef play(self):print('我是', self.name)class Dog(Animal):def __init__(self):super(Dog,self).__init__('旺財')dog = Dog()
dog.play()

我們使用super函數來調用我們在Animal類中所繼承的__init__構造方法,完之后就可以直接使用play來運行Animal類中的內容了
怎么樣,是不是很神奇?

四、類“多態”

多態是基于繼承上的一種形式,我們可以把它大致理解為“父類的多個子類”
還是以類Animal為例,來看看使用多態后結果如何

1.多態基礎

還是這個例子

class Animal:def say(self):print('Animal')class Dog(Animal):passclass Cat(Animal):passdog = Dog()
dog.say()cat = Cat()
cat.say()

這里我們用兩個形式來繼承Animal,它們分別是類Dog和類Cat
我們的兩個子類繼承父類Animal之后,使用了父類中的方法say,這個大家應該能理解
接下來,我們來看點深層的內容

2.子類不同形態

這里我們的目標是使用2個不同的子類來通過共同繼承父類Animal來輸出不同的內容

其實也不難,只要在類Dog與Cat中分別加入自己的內容即可

具體代碼如下:

class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
dog.say()cat = Cat()
cat.say()

這里我們的輸出就是Dog與Cat了,我們共同使用了自己所繼承的方法來創造自己不同的結果,這就是多態的體現

3.使用isinstance函數與多態結合判斷類型

這個isinstance函數呢大家不陌生,之前的一個章節中我就用它判斷過類型:對,就是實戰的那一章,我用這個來判斷輸入類型(構造旺財的那一課,大家可以翻翻我之前的文章找一找)
具體格式我就不說了,大家可以自己根據我使用的方法自己練練手
接下來我們直接上代碼
我們的isinstance函數和我們的多態是有關系的,所以我把他放在這里節里講解

首先,我們像剛剛那樣使用dog變量與cat變量分別迭代類Dog與類Cat

class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
cat = Cat()

好,不要眨眼,接下來就是重頭戲!

我們這里其實也能把cat與dog變量看做一種調用繼承的形式。根據這個邏輯,我們可以用isinstance來判斷繼承的正誤,簡稱來說就是看是不是親生的
在這里插入圖片描述

OK,我們先上代碼

class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
cat = Cat()print(isinstance(dog,Dog))
print(isinstance(dog,Animal))
print(isinstance(cat,Cat))
print(isinstance(cat,Animal))

這里我們的輸出是:

True
True
True
True

好,現在我們知道了,dog和cat都是自己的祖宗親生的了
在這里插入圖片描述
接下來,我們就要好好琢磨琢磨
首先,我們把后面幾行單獨剔出來檢查

dog = Dog()
cat = Cat()print(isinstance(dog,Dog))
print(isinstance(dog,Animal))
print(isinstance(cat,Cat))
print(isinstance(cat,Animal))

我們這里使用dog和cat兩個變量“繼承”了類Dog,Cat與Animal
所以,我們的這里的輸出是正確的

我之前講過,其實我們的數據類型,像int,float,str,list等等,其實都是一個類,我們只要使用isinstance函數就能看出,逗號“,”前的是不是逗號“,”后的類型。所以,大家現在懂數據類型與類的關聯性原理了吧

總結

好了,今天的內容到此結束。實在是寫不動了,下次再努力吧
下節課,我們將學習類的最后一講:拓展篇,大家敬請期待!如有不懂,別忘了問我喲!下期見~~~

【制作不易,別忘了一圈三連,點個關注!!!】

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10773.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6818Linux內核開發移植

Linux內核開發移植 Linux內核版本變遷及其獲得 Linux是最受歡迎的自由電腦操作系統內核&#xff0c; 是一個用C語言寫成&#xff0c; 并且符合POSIX標準的類Unix操作系統 Linux是由芬蘭黑客Linus Torvalds開發的&#xff0c; 目的是嘗試在英特爾x86架構上提供自由免費的類Un…

Task Office for Mac v9.0激活版:任務管理新境界

還在為繁瑣的任務管理而煩惱嗎&#xff1f;Task Office for Mac為您帶來全新的任務管理體驗。簡潔明了的界面設計&#xff0c;讓您輕松上手&#xff1b;強大的任務管理和項目管理功能&#xff0c;讓您輕松掌握任務進度&#xff1b;多用戶協作功能&#xff0c;讓團隊協作更加高效…

ubuntu24.04安裝ros

ubuntu24.04安裝ros 踩坑 踩坑 目前安裝人數比較少&#xff0c;沒有較為詳細的博客&#xff0c;參考官網的鏈接 http://docs.ros.org/en/rolling/Installation/Ubuntu-Install-Debians.html 同時在如下的一步中會找不到網址報錯&#xff0c;此時可以參考https://blog.51cto.c…

Excel辦公技巧之下拉菜單

在日常辦工中&#xff0c;經常需在單元格中輸入特定的值&#xff0c;此時我們可以使用下拉菜單解決&#xff0c;輸入錯誤和錯誤值&#xff0c;可以一勞永逸的解決固定數據輸入問題。 使用Excel下拉菜單時&#xff0c;它在數據輸入和驗證方面發揮著重要作用通過點擊單元格的下拉…

學習筆記-Vue3中Hook函數

什么是Hook函數 Hook翻譯過來是鉤子的意思&#xff0c;其本質上是一組可復用的函數。簡單理解來說&#xff0c;你能夠在不同的組件中&#xff0c;實現相同的代碼邏輯&#xff0c;以達到代碼復用、提高維護性的效果。那為何叫’鉤子’呢&#xff0c;我的理解是&#xff1a; 它可…

商業數據分析--時間序列圖及趨勢分析

繪制時間序列圖,并指出存在什么樣的狀態如上兩圖: 可見狀態:從時間序列圖可以看出,這些數據存在明顯的季節性波動,每年的第4季度值都最高,而第2季度值最低。同時也存在一些下降的趨勢。 通過引進虛擬變量,建立多元線性回歸模型。答: 通過引入虛擬變量,我們可以建立如下的…

Oracle數據庫之多表查詢、層次查詢(五)

目錄 前言 Oracle 的連接條件的類型 多表查詢 1. 使用JOIN關鍵字 2. 使用WHERE子句進行多表查詢 3. 子查詢 4. EXISTS關鍵字 5. 集合運算 6. 注意事項&#xff1a; 層次查詢 前言 Oracle 的連接條件的類型 等值連接不等值連接外連接自連接 多表查詢 在Oracle數據…

商場學習之微服務

前言 寒假前在新電腦上配置了java環境&#xff0c;maven倉庫&#xff0c;node,js&#xff0c;navicat&#xff0c;MySQL&#xff0c;linux&#xff0c;vmware等環境&#xff0c;創建了6個mysql數據庫&#xff0c;77張表。 如此多的表&#xff0c;字段&#xff0c;去手寫基礎…

Web入門——三欄布局頁面

前置知識 內外邊距 內邊距(padding)&#xff1a; padding是元素邊框與其內容之間的空間。也就是說&#xff0c;如果你給一個元素設置了內邊距&#xff0c;這個空間會作為元素內容與元素邊框之間的緩沖區域。設置內邊距會使元素本身變大。例如padding:10px就創建了10像素的空間…

Qt之QMqtt 發送圖片數據

簡述 MQTT(消息隊列遙測傳輸)是ISO標準下基于發布/訂閱范式的消息協議;它工作在TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議,為此,它需要一個消息中間件; MQTT是一個基于客戶端-服務器的消息發布/訂閱傳輸協議;MQT…

Ubuntu設置中午輸入法

本篇博客將指導您如何在Ubuntu系統中設置中文輸入法&#xff0c;讓您能夠輕松地進行中文輸入。 準備工作 在開始之前&#xff0c;請確保您的系統已經更新到最新版本。這可以通過以下命令來完成&#xff1a; sudo apt update && sudo apt upgrade這將幫助確保所有的軟…

Docker in Docker(DinD)原理與實戰

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《Docker幻想曲&#xff1a;從零開始&#xff0c;征服容器宇宙》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、Docker簡介 2、Docker …

使用 AI Assistant for Observability 和組織的運行手冊增強 SRE 故障排除

作者&#xff1a;Almudena Sanz Oliv, Katrin Freihofner, Tom Grabowski 通過本指南&#xff0c;你的 SRE 團隊可以實現增強的警報修復和事件管理。 可觀測性 AI 助手可幫助用戶使用自然語言界面探索和分析可觀測性數據&#xff0c;利用自動函數調用來請求、分析和可視化數據…

Harmony 添加library依賴庫步驟

在Harmony添加library依賴庫步驟如下&#xff1a; 1、在library中定義名字 在library中的oh-package.json5中定義library對外的名字是什么&#xff1a;格式是 “name”:“ohos/名字” {"name": "ohos/library_name" //名字 }2、在項目目錄build-profi…

windows系統安裝Ubuntu子系統

安裝前先在 控制面板 中打開 程序與功能選項 &#xff0c;點擊 啟用或關閉Windows功能&#xff1a; 勾選 適用于 Linux的Windows子系統 和 虛擬機平臺 、 Hyper-v 。 重啟電腦后再 Microsoft Store Windows應用商店 中下載合適的Ubuntu版本。 運行Ubuntu程序&#xff0c;如出現…

【實戰】算法思路總結

面試過程中&#xff0c;總是被拷打&#xff0c;信心都要沒了。但是也慢慢摸索出一些思路&#xff0c;希望對大家有幫助。 &#xff08;需要多用一下ACM模式&#xff0c;力扣模式提供好了模板&#xff0c;自己在IDEA里面寫的話&#xff0c;還是會有些陌生&#xff09; 0、基本…

僵尸進程111

Linux 系統中的進程可能處于如下狀態中的一種&#xff1a; D 不可中斷的休眠 I 空閑 R 運行中 S 休眠 T 被調度信號終止 t 被調試器終止 Z 僵尸狀態 Interruptible Sleep&#xff0c;可中斷睡眠&#xff0c;在 ps 命令中顯示 S。處在這種睡眠狀態的進程是可以通過給它…

OC中Block為什么不能為nil

在 Objective-C 中&#xff0c;向 nil 對象發送消息是完全有效的&#xff0c;這是因為 Objective-C 運行時對 nil 消息發送進行了特別的處理。當你向 nil 對象發送消息時&#xff0c;消息會被靜默地忽略&#xff0c;不執行任何操作&#xff0c;也不會返回任何值&#xff08;或者…

Unity Editor 找物體助手

找啊找朋友~ &#x1f371;功能介紹&#x1f959;使用方法 &#x1f371;功能介紹 &#x1f4a1;輸入相關字符串&#xff0c;它會幫你找到名稱中帶有該字符串的所有物體&#xff0c;還會找包含該字符串的Text、TextMeshProUGUI。 &#x1f959;使用方法 &#x1f4a1;導入插…

小學拼音弄一下

import re from xpinyin import Pinyindef remove_middle_characters(text):# 僅保留漢字chinese_chars re.findall(r[\u4e00-\u9fff], text)cleaned_text .join(chinese_chars)# 如果字符數為偶數&#xff0c;則在中間添加空格if len(cleaned_text) % 2 0:middle_index le…