python面向對象三大特性、類的約束、print帶顏色輸出及super補充

面向對象三大特性、類的約束、print帶顏色輸出及super補充

簡述:

python面向對象的三大特性:

1.繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類,繼承:是基于抽象的結果,通過編程語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類

2.封裝,顧名思義就是將內容封裝到某個地方,以后再去調用被封裝在某處的內容。

3.多態指的是一類事物有多種形態

繼承

上篇博客已做闡述

封裝

在使用面向對象封裝特性時,大致分兩個步驟:

1.將內容封裝到某處;

class Foo:def __init__(self,name,age):   # 稱為構造方法,根據類創建對象自動執行self.name = nameself.age = age
obj1 = Foo("alex",18)   # 將alex 和18 分別封裝到obj1的name和age屬性中
obj2 = Foo("taibai",30)   # 將taibai 和30分別封裝到obj2的name和age屬性中

self為一個形式參數,接收obj1和obj2對象內存地址,當實例化對象時,對象屬性內容被封裝到obj1和obj2中,每個對象中都有name和age屬性

2.從某處調用被封裝的內容

調用封裝內容時,有兩種情況:

1.通過對象直接調用

class Foo:def __init__(self,name,age):self.name = nameself.age = age
obj1 = Foo("alex",18)
print(obj1.name)
print(obj1.age)obj2 = Foo("taibai",20)
print(obj2.name)
print(obj2.age)
# 通過對象直接調用被封裝的內容

2.通過self間接調用

執行類中的方法時,需要self間接調用被封裝的內容

class Foo:sef __init__(self,name,age):self.name =nameself.age = agedef detail(self):print(self.name)print(self.age)
obj1 = Foo("alex",18)
obj1.detail() # python默認會將obj1傳給self參數,此時detail中的self為obj1
obj2 = Foo("taibai",30)
obj1.detail() # python默認會將obj1傳給self參數,此時detail中的self為obj2

綜上所述,對于面向對象的封裝來說,其實就是使用構造方法將內容封裝到 對象 中,然后通過對象直接或者self間接獲取被封裝的內容。

多態

多態,同一個對象,多種形態。python默認支持多態。

# 在java或者c#定義變量或者給函數傳值必須定義數據類型,否則就報錯。def func(int a):print('a必須是數字')# 而類似于python這種弱定義類語言,a可以是任意形態(str,int,object等等)。
def func(a):print('a是什么都可以')# 再比如:
class F1:passclass S1(F1):def show(self):print 'S1.show'class S2(F1):def show(self):print 'S2.show'# 由于在Java或C#中定義函數參數時,必須指定參數的類型
# 為了讓Func函數既可以執行S1對象的show方法,又可以執行S2對象的show方法,所以,定義了一個S1和S2類的父類
# 而實際傳入的參數是:S1對象和S2對象def Func(F1 obj):
"""Func函數需要接收一個F1類型或者F1子類的類型"""print obj.show()s1_obj = S1()
Func(s1_obj)  # 在Func函數中傳入S1類的對象 s1_obj,執行 S1 的show方法,結果:S1.shows2_obj = S2()
Func(s2_obj)  # 在Func函數中傳入Ss類的對象 ss_obj,執行 Ss 的show方法,結果:S2.showPython偽代碼實現Java或C  # 的多態

鴨子類型

class A:def f1(self):print('in A f1')def f2(self):print('in A f2')class B:def f1(self):print('in A f1')def f2(self):print('in A f2')obj = A()
obj.f1()
obj.f2()obj2 = B()
obj2.f1()
obj2.f2()

A和B兩個類完全沒有耦合性,但在某種意義上卻統一了一個標準

相同的功能設定了相同的名字,這樣便于開發,這兩個方法就互為鴨子類型

類的約束

這里所指的約束是對類的約束

對類的約束的兩種方法:

  1. 提取?類. 然后在?類中定義好?法. 在這個?法中什么都不??. 就拋?個異常就可以了. 這樣所有的?類都必須重寫這個?法. 否則. 訪問的時候就會報錯.
  2. 使?元類來描述?類. 在元類中給出?個抽象?法. 這樣?類就不得不給出抽象?法的具體實現. 也可以起到約束的效果.

第一種方法:

class Payment:def pay(self,money):raise Exception("你沒有實現pay方法")  # 下面幾個類的父類,指定標準,繼承該基類的子類中必須定義pay方法,否則繼承此基類pay方法主動拋出異常
class QQpay(Payment):def pay(self,money):print(f"使用QQ支付{money}元")
class Alipay(Payment):def pay(self,money):print(f"使用阿里支付{money}元")
class Wechat(Payment):def fuqian(self,money):print(f"使用微信支付{money}元")
def pay(obj,money):obj.pay(money)
a = Alipay()
b = QQpay()
c = Wechatpay()
pay(a,100)
pay(b,200)
pay(c,300)

第二種方法:引入抽象類的概念進行處理

from abc import ABCMeta,abstractmeethod
class Payment(metaclass = ABCMeta):   # 抽象類 接口類  規范和約束  metaclass指定的是一個元類@abstractmethoddef pay(self):pass  # 抽象方法
class QQpay(Payment):def pay(self,money):print(f"使用QQ支付{money}元")
class Alipay(Payment):def pay(self,money):print(f"使用阿里支付{money}元")
class Wechat(Payment):def fuqian(self,money):print(f"使用微信支付{money}元")
def pay(obj,money):obj.pay(money)
w = Wechatpay()
pay(w,100)

super補充

class A:   # 1def f1(self):  # 2print('in A f1')def f2(self):  # 3print('in A f2')  # 9class Foo(A):  # 4def f1(self):  # 5super().f2()  # 8  super(Foo,self).f2() obj對象內無f2 方法,在其父類A中查找print('in A Foo') # 10obj = Foo()  # 6  實例化對象obj,并將obj的內存地址傳給self
obj.f1()  # 7
# 結果:
'in A f2'
'in A Foo'
class A:  # 1def f1(self): # 2print('in A')class Foo(A): # 3def f1(self): # 4super().f1()  # 12  super(Foo,self).f1()print('in Foo') #  14class Bar(A):  # 5def f1(self):  # 6print('in Bar')  # 13class Info(Foo,Bar): # 7def f1(self):  # 8super().f1()  # 11  self為Info,對象空間f1方法,按照mro算法執行Info下一個Foo  super(Info,self).f1()print('in Info f1') # 15obj = Info() # 9 實例化對象
obj.f1() # 10 
# 結果:
'in Bar'
'in Foo'
'in Info f1'
class A: # 1def f1(self): # 2print('in A')class Foo(A): # 3def f1(self): # 4super().f1()print('in Foo')class Bar(A): # 5def f1(self): # 6print('in Bar') # 12class Info(Foo,Bar): # 7def f1(self): # 8super(Foo,self).f1() # 11 按照mro算法執行Foo下一個Bar.f1()print('in Info f1') # 13obj = Info() # 9
obj.f1() # 10
# 結果:
'in Bar'
'in Info f1'

print帶顏色輸出

書寫格式: 開頭部分:\033[顯示方式;前景色;背景色m + 結尾部分:\033[0m

開頭部分的三個參數:顯示方式,前景色,背景色是可選參數,可以只寫其中的某一個;另外由于表示三個參數不同含義

的數值都是唯一的沒有重復的,所以三個參數的書寫先后順序沒有固定要求,系統都能識別;但是,建議按照默認的格式

規范書寫。對于結尾部分,其實也可以省略,但是為了書寫規范,建議\033[***開頭,\033[0m結尾。

字體色背景色顏色描述
3040黑色
3141紅色
3242綠色
3343黃色
3444藍色
3545紫紅色
3646青藍色
3747白色
顯示方式效果
0終端默認設置
1高亮顯示
4使用下劃線
5閃爍
7反白顯示
8不可見
22非粗體
24非下劃線
25非閃爍
27非反顯

常見開頭格式

\033[0m 默認字體正常顯示,不高亮

\033[32;0m 紅色字體正常顯示

\033[1;32;40m 顯示方式: 高亮 字體前景色:綠色 背景色:黑色

\033[0;31;46m 顯示方式: 正常 字體前景色:紅色 背景色:青色

轉載于:https://www.cnblogs.com/lifangzheng/p/11317813.html

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

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

相關文章

dayjs也可回顯AntD DatePicker的值

遇到的問題:react 使用AntD 表單里有多個RangePicker,查看修改時要回顯值。 antd的DatePicker需要的是moment對象。但是項目里引的是dayjs庫 解決方式: 方式一:直接多引moment.js庫,字符串轉moment對象 moment(2022-02) 方式二:不甘心引兩…

打造“神犇”是教育的未來嗎?

這年頭,品學兼優、身懷特長的“神犇”,拼的不僅是天賦異稟和后天努力,更是身后爹媽的錢包,而本該實現社會公平的教育,反而加速和凝固了社會的不公。 高等教育的終極目標真的是造就學業超人嗎?《紐約時報》刊…

洛谷 P3243 【[HNOI2015]菜肴制作】

第一眼看到這題,頓時懵逼,一個 \(SB\) 拓撲序竟然是黑題,當場笑噴。 \(Of\) \(course\),這題我是用堆做的。(其實是優先隊列,手寫堆這么垃圾我怎么可能會用呢) \((1)\) 首先建圖。如果 \(x\) 需…

AntD 官網樣例 InputRef報錯原因

在官網可編輯表格typescript樣例里 const inputRef useRef<InputRef>(null); InputRef項目報錯原因是ant design的版本問題! antd 4.19版本重寫了input 可通過InputRef來使用input組件的ref

電路原理圖檢查的十大步驟詳解

最近一直在做嵌入式系統&#xff0c;畫原理圖。最后&#xff0c;為了保證原理圖準確無誤&#xff0c;檢查原理圖花費我近兩周的時間&#xff0c;在此&#xff0c;把我在檢查原理圖方面的心得體會總結在此&#xff0c;供大家參考&#xff0c;說得不對的地方歡迎大家指出。 往往我…

亞倫?斯沃茨:怎樣有效利用時間

編者按&#xff1a;今天是著名黑客亞倫?斯沃茨&#xff08;Aaron Swartz&#xff09;頭七的日子。斯沃茨14歲就參與創造RSS 1.0規格的制定&#xff0c;曾在斯坦福大學就讀了一年&#xff0c;是社交新聞網站Reddit的三位創始人之一……斯沃茨自殺時才年僅26歲。這26歲的短暫生命…

AntD 可編輯行表格

本地數據代碼模板自用,官網例子改改 // 編輯行的自定義表格 import React, { useState } from "react"; import {Table,Input,InputNumber,Popconfirm,Form,Typography,Divider, } from "antd";interface Item {key: string;name: string;age: number;add…

SharePoint 2013 - System Features

1. Embed Information & Convert to PDF 功能&#xff0c;在文檔的preview界面&#xff08;hover panel&#xff09;; 2. Share功能可以選擇是否發送郵件 -- Done 4. Shredded Storage, 將文檔的內容和每次的更改分開存儲&#xff0c;每次只存儲更改的內容&#xff0c;而不…

三心二意,助你好運?

經驗說&#xff1a;做事要專心致志。 實驗說&#xff1a;專心致志常常讓人缺少一雙發現的眼睛。 專心致志從來都被當做一個美德來歌頌。從來我們就認為要想成為偉大的人就必須要像牛頓老師那樣把鐘當成吃的放到鍋里煮才行&#xff0c;至少至少也得有能在集市上看書的本事。否則…

React Antd Upload自定義上傳customRequest

單獨的上傳圖片接口要傳參,action方式不太適合,需要使用自定義上傳customRequest覆蓋 公司代碼不可弄,就發一個可用的demo例子 import React, { useState } from "react"; import { render } from "react-dom"; import "antd/dist/antd.css"; i…

HDU 4109 Instrction Arrangement

題目鏈接&#xff1a;https://vjudge.net/problem/HDU-4109 題目大意 有 N 個指令&#xff0c;標號從 0 ~ N - 1&#xff0c;和 M 個指令間的先后關系&#xff0c;每個關系都有一個權值 w&#xff0c;表示后一個指令在前一個指令開始時間之后 w 納秒才開始執行。現在要并發執行…

養成一個習慣需要多久?

有人說養成一個習慣需要21天&#xff0c;有人說30天……養成習慣到底需要多少天&#xff1f; _hzw 2012-11-09 18:04又快到年末了。 年初時&#xff0c;你曾許諾要養成一些好習慣&#xff0c;比如要常運動、多讀書、少微博。有人說說養成一個習慣只需要堅持21天&#xff1b;21天…

vue3 eslint The template root requires exactly one element問題

vue項目中手動引入eslint npm install eslint --save-dev eslint初始化 npx eslint --init 運行時npm run lint 簡單語法問題--fix會自動修復 但是vue3項目出現只能有一個根節點的問題 原因在于 eslintrc.js里extends中plugin:vue/essential的問題 看eslint-plugin-vue官網…

你所知道的學習方法,都是錯的!

你所知道的學習方法&#xff0c;都是錯的&#xff01; 上課的時候記筆記&#xff1f;哪門功課不行&#xff0c;就集中精力專項突擊&#xff1f;自習的時候不要晃&#xff0c;選好一個地兒安安穩穩地待那兒學習&#xff1f;你還在這樣學習嗎&#xff1f;不要被騙了&#xff1a;這…

BZOJ 1683.City skyline 城市地平線

傳送門 從左到右掃一遍&#xff0c;考慮什么時候會和之前形成同一幢房子從而不用統計 顯然是當前的高度和之前某個點高度相同&#xff0c;并且它們之間沒有更矮的建筑 考慮用一個單調棧維護一個單調上升的房子輪廓&#xff0c;然后對于掃到的每一個高度&#xff0c;看看棧里有沒…

Vue3 eslint 編譯器宏和 defineProps,defineEmits,no-undef 規則警告

.eslintrc.js修改 定義全局globals module.exports {globals: {defineProps: readonly,defineEmits: readonly,defineExpose: readonly,withDefaults: readonly},env: {browser: true,es2021: true},extends: [plugin:vue/vue3-strongly-recommended, standard],parserOptio…

Java生鮮電商平臺-SpringCloud微服務開發中的數據架構設計實戰精講

Java生鮮電商平臺-SpringCloud微服務開發中的數據架構設計實戰精講 Java生鮮電商平臺: 微服務是當前非常流行的技術框架&#xff0c;通過服務的小型化、原子化以及分布式架構的彈性伸縮和高可用性&#xff0c;可以實現業務之間的松耦合、業務的靈活調整組合以及系統的高可用性…

JS兩個對象數組過濾掉相同的對象

let arr1 [{uid:1,name:張三},{uid:2,name:李四}]; let arr2 [{id:1,name:張三},{id:2,name:王五,age:23},{id:3,name:羅翔}]; 去掉arr2中包含的arr1相同name的對象: //ES6的方法&#xff0c;得到新數組 const newArr arr2.filter((item) > {return !arr1.some(ele>…

亞倫?斯沃茨:提升時間的品質

亞倫?斯沃茨&#xff1a;提升時間的品質 不休不眠地工作是低效的&#xff0c;怎樣發揮時間的最大效率&#xff1f; 伏維閣主 2013-01-18 16:45圖片來源&#xff1a;personalitytutor.com &#xff08;亞倫?斯沃茨Aaron Swartz / 文&#xff09;《 怎樣有效利用時間 》中給出的…

useEffect中使用異步函數

useEffect是不能直接用 async await 語法糖的 /* 錯誤用法 &#xff0c;effect不支持直接 async await*/useEffect(async ()>{/* 請求數據 */const res await getData()},[]) useEffect 的回調參數返回的是一個清除副作用的 clean-up 函數。因此無法返回 Promise&#xf…