網站首頁 編程語言 正文
1.基礎概念
在面向對象的程序設計過程中有兩個重要概念:類(class
)和對象(object
,也被稱為實例,instance),其中類是某一批對象的抽象,可以把類理解成某種概念;對象才是一個具體存在的實體。從這個意義上看,日常所說的人,其實都是人的對象,而不是人類。
Python 定義類的簡單語法如下:
class 類名:
? ? 執行語句...
? ? 零個到多個類變量...
? ? 零個到多個方法...
類名只要是一個合法的標識符即可,但這僅僅滿足的是 Python 的語法要求:如果從程序的可讀性方面來看,Python 的類名必須是由一個或多個有意義的單詞連綴而成的,每個單詞首字母大寫,其他字母全部小寫,單詞與單詞之間不要使用任何分隔符。
從上面定義來看,Python 的類定義有點像函數定義,都是以冒號(:)作為類體的開始,以統一縮進的部分作為類體的。區別只是函數定義使用 def 關鍵字,而類定義則使用 class 關鍵字。
Python 的類定義由類頭(指 class 關鍵字和類名部分)和統一縮進的類體構成,在類體中最主要的兩個成員就是類變量和方法。如果不為類定義任何類變量和方法,那么這個類就相當于一個空類,如果空類不需要其他可執行語句,則可使用 pass 語句作為占位符。
例如,如下類定義是允許的:
class Empty: ? ? pass
通常來說,空類沒有太大的實際意義。
類中各成員之間的定義順序沒有任何影響,各成員之間可以相互調用。
Python 類所包含的最重要的兩個成員就是變量和方法,其中類變量屬于類本身,用于定義該類本身所包含的狀態數據:而實例變量則屬于該類的對象,用于定義對象所包含的狀態數據:方法則用于定義該類的對象的行為或功能實現。
Python 是一門動態語言,因此它的類所包含的類變量可以動態增加或刪除(程序在類體中為新變量賦值就是增加類變量),程序也可在任何地方為已有的類增加變量;程序可通過 del 語句刪除己有類的類變量。
類似的是,Python 對象的實例變量也可以動態增加或刪除(只要對新實例變量賦值就是增加實例變量),因此程序可以在任何地方為己有的對象增加實例變量;程序可通過 del 語句刪除已有對象的實例變量。
在類中定義的方法默認是實例方法,定義實例方法的方法與定義函數的方法基本相同,只是實例方法的第一個參數會被綁定到方法的調用者(該類的實例),因此實例方法至少應該定義一個參數,該參數通常會被命名為 self。
注意:實例方法的第一個參數并不一定要叫 self,其實完全可以叫任意參數名,只是約定俗成地把該參數命名為 self,這樣具有最好的可讀性。
在實例方法中有一個特別的方法:__init__,
這個方法被稱為構造方法。構造方法用于構造該類的對象,Python 通過調用構造方法返回該類的對象(無須使用 new)。
Python 中很多這種以雙下劃線開頭、雙下劃線結尾的方法,都具有特殊的意義,本教程后面還會詳細介紹這些特殊的方法。
構造方法是一個類創建對象的根本途徑,因此 Python 還提供了一個功能:如果開發者沒有為該類定義任何構造方法,那么 Python 會自動為該類定義一個只包含一個 self
參數的默認的構造方法。
2.定義一個 Person 類
下面程序將定義一個 Person 類:
class Person : ? ? '這是一個學習Python定義的一個Person類' ? ? # 下面定義了一個類變量 ? ? hair = 'black' ? ? def __init__(self, name = 'Charlie', age=8): ? ? ? ? # 下面為Person對象增加2個實例變量 ? ? ? ? self.name = name ? ? ? ? self.age = age ? ? # 下面定義了一個say方法 ? ? def say(self, content): ? ? ? ? print(content)
上面的 Person
類代碼定義了一個構造方法,該構造方法只是方法名比較特殊:__init__
,該方法的第一個參數同樣是 self,被綁定到構造方法初始化的對象。
與函數類似的是,Python 也允許為類定義說明文檔,該文檔同樣被放在類聲明之后、類體之前,如上面程序中第二行的字符串所示。
在定義類之后,接下來即可使用該類了。
Python 的類大致有如下作用:
- 定義變量;
- 創建對象;
- 派生子類;
3.類定義
# coding:utf-8 if __name__ == '__main__': ? ? ''' ? ? 定義:class 類名(object): ? ? ? ? ? ?類屬性,方法等...... ? ? 實例化: 類名(無參|參數......) ? ? ''' ? ? class A(object): ? ? ? ? pass ? ? a = A() ? ? print(a) ?# <__main__.A object at 0x00D9DD50>
4.類方法定義
# coding:utf-8 if __name__ == '__main__': ? ? ''' ? ? 定義:通過def + 方法名(self,參數1,參數2......) self是必須的 ? ? 調用:object.方法名(參數1,參數2......) ? ? ''' ? ? class B(object): ? ? ? ? sex = 'man' ? ? ? ? def talk(self, name): ? ? ? ? ? ? print(name) ? ? b = B() ? ? b.talk('ok') ?# ok
5.類的繼承
# coding:utf-8 if __name__ == '__main__': ? ? ''' ? ? 在聲明類的時候指定這個類繼承哪些類 ? ? class 類名(extend1,extend2.......): ? ? ? ?屬性,方法...... ? ? extend1,extend2 代表要繼承的類。可以一次性繼承多個類 ? ? 繼承順序為從左到右,如果繼承的方法或屬性重復,以先繼承的為主 ? ? class.__mro__ 查看類的繼承鏈 ? ? ''' ? ? class C(object): ? ? ? ? sex = 'woman' ? ? ? ? def see(self, name): ? ? ? ? ? ? print(f'看{name}') ? ? ? ? def talk(self, name): ? ? ? ? ? ? print(f'說{name}') ? ? class D(B, C): ? ? ? ? ? pass ? ? d = D() ? ? d.talk('yes') ?# yes 不是 說yes ?以先繼承的為主 ? ? d.see('書') ?# 看書 ? ? print(d.sex) ?# man 不是 woman ?以先繼承的為主 ? ? print(D.__mro__) ?# (, , , )
6.類的公有,私有
# coding:utf-8 if __name__ == '__main__': ? ? ''' ? ? 私有屬性定義: __+變量名 ? ? 私有方法定義: __+函數名(self,參數1,參數2......) ? ? 私有外部無法訪問,只能內部訪問。但是私有屬性可以在外部通過object._+類名__+變量名 強制訪問 ? ? ''' ? ? class E(object): ? ? ? ? __name = 'xie' ? ? ? ? sex = 'man' ? ? ? ? def __talk(self, name): ? ? ? ? ? ? print(name) ? ? ? ? def run(self): ? ? ? ? ? ? self.__talk('ok') ? ? ? ? def dp(self): ? ? ? ? ? ? print(self.__name) ? ? e = E() ? ? # print(e.__name) Error 外部無法訪問私有屬性 D ? ? print(e.sex) ?# man ? ? # e.__talk('yes') Error 外部無法訪問私有方法 ? ? # object._+類名__+變量名 強制訪問 ? ? print(e._E__name) ?# xie ? ? e.run() ?# ok ? ? e.dp() ?# xie
7.子類調用父類的方法
# coding:utf-8 if __name__ == '__main__': ? ? ''' ? ? 通過super().方法(參數1,參數2......)調用,該用法要求python版本3以上 ? ? 或 ? ? supper(子類名,self).方法(參數1,參數2......) ? ? ''' ? ? class F(object): ? ? ? ? def talk(self, name): ? ? ? ? ? ? print(f'super name is {name}') ? ? class G(F): ? ? ? ? def talk(self, children_name, super_name): ? ? ? ? ? ? self.print_children_name(children_name) ? ? ? ? ? ? super().talk(super_name) ? ? ? ? def talk2(self, children_name, super_name): ? ? ? ? ? ? self.print_children_name(children_name) ? ? ? ? ? ? super(G, self).talk(super_name) ? ? ? ? def print_children_name(self, name): ? ? ? ? ? ? print(f'children name is {name}') ? ? g = G() ? ? g.talk('小明', '大明') ?# children name is 小明 super name is 大明 ? ? g.talk2('小明', '大明') ?# children name is 小明 super name is 大明
原文鏈接:https://blog.csdn.net/qq_29744347/article/details/122947305
相關推薦
- 2023-05-30 python中pip無法正確安裝或路徑出錯的解決方案_python
- 2022-07-19 分布式事務其中的那些坑
- 2022-07-04 python實現PyEMD經驗模態分解殘差量分析_python
- 2022-04-11 SQL?Server的觸發器你了解多少_MsSql
- 2022-07-20 C語言雙向鏈表的原理與使用操作_C 語言
- 2022-10-02 C++?OpenCV實戰之手寫數字識別_C 語言
- 2023-04-29 C++數組模擬之單鏈表與雙鏈表和棧和隊列的實現過程_C 語言
- 2022-06-08 Spring Cloud Nacos 配置變更感知
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支