python - 類和對象

一.類

類名用大寫字母開頭

屬性是類中的變量,方法是類中的函數

類、class關鍵字:

>>> class Turtle:
...     color = 'green'
...     weight = 10
...     legs = 4
...     shell = True
...     mount = '大嘴'
...     def climb(self):
...             print("我正在努力的向前爬")
...     def run(self):
...             print("我正在飛快的向前怕")
...     def bite(self):
...             print("咬死你咬死你")
...     def eat(self):
...             print("有的吃真滿足")
...     def sleep(self):
...             print("困了困了")
...
>>> t1 = Turtle()
>>> t1.color
'green'
>>> t1.weight
10
>>> t1.legs
4
>>> t1.shell
True
>>> t1.mount
'大嘴'
>>> t1.climb()
我正在努力的向前爬
>>> t1.run()
我正在飛快的向前怕
>>> t1.bite()
咬死你咬死你
>>> t1.eat()
有的吃真滿足
>>> t1.sleep()
困了困了

二.封裝

在創建對象之前,通過類將相關的屬性和方法給打包到一起。然后再通過類來生成相應的對象

>>> class C:
...     def hello():
...             print('hello')
...
>>> c = C()
>>> c.hello()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: C.hello() takes 0 positional arguments but 1 was given
>>> class C:
...     def getSelf(self):
...             print(self)
...
>>> c = C()
>>> c.getSelf()
<__main__.C object at 0x000001536290D2E0>
>>> c
<__main__.C object at 0x000001536290D2E0>

傳遞到方法中self參數的實參就是實例對象本身

一個類可以生成無數個對象,當調用類中的方法時,python為了明確是哪一個實例對象在調用該方法,于是使用self參數將調用該方法的實例對象的信息進行了傳遞。

三.繼承

當子類繼承父類時,子類擁有和父類相同的方法和相同的屬性

>>> class A:
...     x = 1
...     def hell(self):
...             print('你好')
...
>>> class B(A):
...     def bb(self):
...             print('我是B的對像')
...
>>> b = B()
>>> b.x
1
>>> b.bb()
我是B的對像
>>> b.hell()
你好
>>> class B(A):
...     x = 123
...     def hello(self):
...             print('我是B的對象')
...
>>> b = B()
>>> b.x
123
>>> b.hello()
我是B的對象

isinstance():判斷某個對象是否屬于某個方法

>>> isinstance(b,B)
True
>>> isinstance(b,A)
True

issubclass():檢測一個類是否為某個類的子類

>>> issubclass(B,A)
True

多重繼承

>>> class A:
...     x = 1
...     def hello(self):
...             print('你好')
...
>>>
>>> class B():
...     x = 123
...     def hello(self):
...             print('這里是B')
...
>>> class C(A,B):
...     pass
...
>>> c = C()
>>> c.x
1
>>> c.hello()
你好

多重繼承時,多個父類擁有同樣的屬性和方法,子類對象調用時優先級從左至右。

組合:

組合(將需要的類一起進行實例化并放入新的類中),非繼承關系的幾個類放到一起

>>> class A:
...     def hello(self):
...             print('這里是A')
...
>>> class B:
...     def hello(self):
...             print('這里是B')
...
>>> class C:
...     def hello(self):
...             print('這里是C')
...
>>> class ABC:
...     a = A()
...     b = B()
...     c = C()
...     def hello(self):
...             self.a.hello()
...             self.b.hello()
...             self.c.hello()
...
>>> abc = ABC()
>>> abc.hello()
這里是A
這里是B
這里是C

綁定

實例對象跟類的方法進行綁定

實例能擁有自己的屬性,如果要通過類的方法對屬性進行操作,則需要使用self進行綁定

>>> class A:
...     x = 120
...     def set_x(self,i):
...             self.x = i
...
>>> a = A()
>>> a.set_x(520)
>>> a.x
520

若沒有這個self,那么直接對x進行操作,只是在set_x()函數內部創建了一個局部變量x

四.構造函數

構造函數__init__()

在類中定義__intit__()方法,就可以在實例化對象的時候實現一些變量的初始化

如果創建類的時候,沒有添加構造函數,python解釋器會自動創建一個不執行任何操作的默認構造函數;也就是說,只要創建類,一定會伴隨著一個構造函數誕生。只不過可以自定義一個構造函數,也可以由python解釋器自動創建一個默認的構造函數。

>>> class go:
...     def __init__(self, x, y):
...             self.x = x
...             self.y = y
...     def add(self):
...             return self.x + self.y
...     def mul(self):
...             return self.x * self.y
...
>>> a = go(3,4)
>>> a.__dict__
{'x': 3, 'y': 4}
>>> a.add()
7
>>> a.mul()
12

五.重寫

子類可以重新定義父類已有的屬性和方法來對父類中同名的屬性和方法進行覆蓋。

可以在子類中直接調用父類的方法,即調用未綁定的父類方法。但會造成鉆石繼承的問題。

>>> class gozi(go):
...     def __init__(self, x, y, z):
...             go.__init__(self, x, y)
...             self.z = z
...     def add(self):
...             return go.add(self) + self.z
...     def mul(self):
...             return self.x * self.y * self.z
...
>>> b = gozi(2, 3, 4)
>>> b.__dict__
{'x': 2, 'y': 3, 'z': 4}
>>> b.add()
9
>>> b.mul()
24

鉆石繼承問題:

>>> class A:
...     def __init__(self):
...             print('這里是A')
...
>>> class B1(A):
...     def __init__(self):
...             A.__init__(self)
...             print('這里是B1')
...
>>> class B2(A):
...     def __init__(self):
...             A.__init__(self)
...             print('這里是B2')
...
>>> class C(B1, B2):
...     def __init__(self):
...             B1.__init__(self)
...             B2.__init__(self)
...             print('這里是C')
...
>>> c = C()
這里是A
這里是B1
這里是A
這里是B2
這里是C

A被調用了兩次,因為C調用B1、B2,B1、B2又分別調用了A。

為了解決磚石繼承的問題可以使用super()函數。

>>> class A:
...     def __init__(self):
...             print('這里是A')
...
>>> class B1(A):
...     def __init__(self):
...             super().__init__()
...             print('這里是B1')
...
>>> class B2(A):
...     def __init__(self):
...             super().__init__()
...             print('這里是B2')
...
>>> class C(B1, B2):
...     def __init__(self):
...             super().__init__()
...             print('這里是C')
...
>>> c = C()
這里是A
這里是B2
這里是B1
這里是C

六.多態

同一個運算符、函數或對象在不同的場景下具有不同的作用效果

運算符的多態

>>> 3 + 5
8
>>> 'L' + 'ove'
'Love'

函數的多態

>>> len('love')
4
>>> len(['love','jiji','xixi'])
3

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

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

相關文章

從零開始讀RocketMq源碼(二)Message的發送詳解

目錄 前言 準備 消息發送方式 深入源碼 消息發送模式 選擇發送方式 同步發送消息 校驗消息體 獲取Topic訂閱信息 高級特性-消息重投 選擇消息隊列-負載均衡 裝載消息體發送消息 壓縮消息內容 構造發送message的請求的Header 更新broker故障信息 異步發送消息 …

Open3D KDtree的建立與使用

目錄 一、概述 1.1kd樹原理 1.2kd樹搜索原理 1.3kd樹構建示例 二、常見的領域搜索方式 2.1K近鄰搜索&#xff08;K-Nearest Neighbors, KNN Search&#xff09; 2.2半徑搜索&#xff08;Radius Search&#xff09; 2.3混合搜索&#xff08;Hybrid Search&#xff09; …

ai native 模型微調

AI native 模型微調&#xff08;fine-tuning&#xff09;是指在預訓練模型的基礎上&#xff0c;通過對其參數進行進一步訓練&#xff0c;使其在特定任務上表現更佳。以下是關于模型微調的一些基本步驟和概念&#xff1a; ### 1. 準備數據集 - **數據收集**&#xff1a;收集適用…

后端之路——登錄校驗前言(Cookie\ Session\ JWT令牌)

前言&#xff1a;Servlet 【登錄校驗】這個功能技術的基礎是【會話技術】&#xff0c;那么在講【會話技術】的時候必然要談到【Cookie】和【Session】這兩個東西&#xff0c;那么在這之前必須要先講一下一個很重要但是很多人都會忽略的一個知識點&#xff1a;【Servlet】 什么是…

Oracle PL/SQL 循環批量執行存儲過程

1. 查詢存儲過程 根據數據字典USER_OBJECTS查詢出所有存儲過程。 2. 動態拼接字符串&#xff08;參數等&#xff09; 根據數據字典USER_ARGUMENTS動態拼接參數。 3. 動態執行 利用EXECUTE IMMEDIATE動態執行無名塊。 4. 輸出執行信息 利用DBMS_OUTPUT.PUT_LINE輸出執行成功與…

Android Gradle 開發與應用 (十): Gradle 腳本最佳實踐

目錄 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 遷移到Kotlin DSL 1.3 優勢分析 2. 優化依賴管理 2.1 使用依賴版本管理文件 2.2 使用依賴分組 3. 合理使用Gradle插件 3.1 官方插件和自定義插件 3.2 插件管理的最佳實踐 4. 任務配置優化 4.1 使用…

Oracle 19c 統一審計表清理

zabbix 收到SYSAUX表空間告警超過90%告警&#xff0c;最后面給出的清理方法只適合ORACLE 統一審計表的清理&#xff0c;傳統審計表的清理SYS.AUD$不適合&#xff0c;請注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

STM32實戰篇:閃燈 × 流水燈 × 蜂鳴器

IO引腳初始化 即開展某項活動之前所做的準備工作&#xff0c;對于一個IO引腳來說&#xff0c;在使用它之前必須要做一些參數配置&#xff08;例如&#xff1a;選擇工作模式、速率&#xff09;的工作&#xff08;即IO引腳的初始化&#xff09;。 IO引腳初始化流程 1、使能IO引…

LED燈的呼吸功能

"呼吸功能"通常是指 LED 燈的一種工作模式&#xff0c;它模擬人類的呼吸節奏&#xff0c;即 LED 燈的亮度會周期性地逐漸增強然后逐漸減弱&#xff0c;給人一種 LED 在"呼吸"的感覺。這種效果通常用于指示設備的狀態或者簡單地作為裝飾效果。&#xff08;就…

Spring Boot Security自定義AuthenticationProvider

以下是一個簡單的示例&#xff0c;展示如何使用AuthenticationProvider自定義身份驗證。首先&#xff0c;創建一個繼承自標準AuthenticationProvider的類&#xff0c;并實現authenticate方法。 import com.kamier.security.web.service.MyUser; import org.springframework.se…

【Adobe】Photoshop圖層的使用

Adobe Photoshop(簡稱PS)中的圖層是圖像處理中一個核心概念,它允許用戶以堆疊的方式組織圖像的不同部分,從而實現對圖像的復雜編輯和處理而不影響原始圖像。以下是關于Adobe Photoshop圖層的詳細介紹: 一、圖層的定義 圖層就像是透明的紙張,你可以在上面繪制、添加圖像…

YOLOv10改進 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余種損失函數

一、本文介紹 這篇文章介紹了YOLOv10的重大改進&#xff0c;特別是在損失函數方面的創新。它不僅包括了多種IoU損失函數的改進和變體&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;還融合了“Focus”思想&#xff0c;創造了一系列新的損失函數。這些組合形式的…

Android Init Language自學筆記

Android Init Language由五個元素組成&#xff1a;Acttions、Commands、Services、Options和Imports。 Actions和Services隱式聲明了一個新的section。所以的Commands和Options都屬于最近聲明的section。 Services具有唯一的名稱&#xff0c;如果重名會報錯。 Actions Acti…

解決Spring Boot中的高可用性設計

解決Spring Boot中的高可用性設計 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 高可用性設計概述 1.1 什么是高可用性&#xff1f; 高可用性指系統在面對各種故障和異常情況時&#xff0c;仍…

獨立開發者系列(22)——API調試工具apifox的使用

接口的邏輯已經實現&#xff0c;需要對外發布接口&#xff0c;而發布接口的時候&#xff0c;我們需要能自己簡單調試接口。當然&#xff0c;其實自己也可以寫簡單的代碼調試自己的接口&#xff0c;因為其實就是簡單的request請求或者curl庫讀取&#xff0c;調整請求方式get或者…

如果MySQL出現 “Too many connections“ 錯誤,該如何解決?

當你想要連接MySQL時出現"Too many connections" 報錯的情況下&#xff0c;該如何解決才能如愿以償呢&#xff1f;都是哥們兒&#xff0c;就教你兩招吧&#xff01; 1.不想重啟數據庫的情況下 你可以嘗試采取以下方法來解決&#xff1a; 增加連接數限制&#xff1a…

RxJava學習記錄

文章目錄 1. 總覽1.1 基本原理1.2 導入包和依賴 2. 操作符2.1 創建操作符2.2 轉換操作符2.3 組合操作符2.4 功能操作符 1. 總覽 1.1 基本原理 參考文獻 構建流&#xff1a;每一步操作都會生成一個新的Observable節點(沒錯&#xff0c;包括ObserveOn和SubscribeOn線程變換操作…

asp.netWebForm(.netFramework) CSRF漏洞

asp.netWebForm(.netFramework) CSRF漏洞 CSRF&#xff08;Cross-Site Request Forgery&#xff09;跨站請求偽造是一種常見的 Web 應用程序安全漏 洞&#xff0c;攻擊者通過誘使已認證用戶在受信任的網站上執行惡意操作&#xff0c;從而利用用戶的身份 執行未經授權的操作。攻…

echarts實現3D餅圖

先看下最終效果 實現思路 使用echarts-gl的曲面圖&#xff08;surface&#xff09;類型 通過parametric繪制曲面參數實現3D效果 代碼實現 <template><div id"surfacePie"></div> </template> <script setup>import {onMounted} fro…

簡單的找到自己需要的flutter ui 模板

簡單的找到自己需要的flutter ui 模板 網站 https://flutterawesome.com/ 簡介 我原本以為會很難用 實際上不錯 很簡單 打開后界面類似于,右上角可以搜索 點擊view github 相當簡單 很oks