Python学习之面向对象
1. 前言
上次學習了Python的基本語法,這次學面向對象,本博客主要介紹Python的面向對象和一些常用的類。本博客不太適合小白,適合有一定的編程基礎的童鞋.
學習資料主要來自兩處:
B站Python教程全套
Python3 面向對象
本文原創,創作不易,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/?p=211
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/115772156
2. 面向對象
Java和C++中,面向對象編程的思想很常用,兩大思想,面向過程和面向對象.
有關面向對象的相關概念不在贅述,直接引入Python有關面向對象語法,一句話概括,Python中一切皆對象.
2.1. 類
2.1.1. 類的創建
創建語法:
class 類名:語句1語句2和Java類似.類名一般首字母大寫,其余小寫,例子:
class Student:passprint(id(Student)) print(type(Student)) print(Student)輸出結果:
2849693220416 <class 'type'> <class '__main__.Student'>2.1.2. 屬性與方法
這些和Java中的概念是一樣的
一個類可以有:類屬性,實例方法,靜態方法,類方法
先看一個例子:
輸出結果
Student類被創建 編程語言是 Python 張飛 今年 18 歲 Python其中,__init__有點類似于 Java中的構造函數,當創建了這個類的實例時就會調用該方法.而self就先當于Java中的this,self在Python中代表類的實例.
使用一個類就是 實例名 = 類名(參數),調用方法的話,就是實例名.方法名
類屬性是所有實例共享的,調用方法就是 類名.屬性.
靜態方法也是如此,調用方法就是 類名.靜態方法.定義靜態方法要用@staticmethod修飾
類方法,要用@classmethod修飾
2.1.3. 動態綁定屬性和方法
如果某一個實例對象,想給這個實例單獨增加屬性,而且同類的其他實例不能用的話,可以用 實例名.新屬性名 = 值.
這樣,這個新的屬性名只有這個實例可以用.
在class中定義的屬性,所有實例名都可以用.
同時,也可以動態綁定方法,例子如下:
輸出結果:
Student類被創建 Student類被創建 男 我會吃桃2.2. 封裝
封裝是為了提高程序的安全性,Python中沒有設置訪問權限的修飾符,不像Java有private public project這樣的訪問權限修飾符.如果該屬性不希望在類對象外部被訪問,在屬性的前邊使用兩個’_’.
代碼如下:
輸出:
時間是 12 時 23 分 Traceback (most recent call last):File "XXXXXXXX.py", line 14, in <module>print(tm.__company) AttributeError: 'Time' object has no attribute '__company'訪問失敗,但是如果非要訪問,可以通過 實例名._類名__屬性訪問,例如:print(tm._Time__company)就可以輸出結果了.但是這是相當于一個君子約定,所以開發的時候最好不要去訪問用兩個’_'修飾的屬性.
2.3. 繼承
Python是支持多繼承的,這點和C++類似
定義子類時,必須在其構造函數中調用父類的構造函數
如果一個類沒有繼承父類,則默認繼承object類
2.3.1. 繼承的語法
繼承的格式:
class 子類名(父類1,父類2...):pass代碼實現:
class Person:life = '吃東西'def __init__(self, name, age):print('一個人被創建')self.name = nameself.age = agedef show(self):print(self.name, self.age)class Student(Person):def __init__(self, name, age, score):super().__init__(name, age)print('學生被創建')self.score = scorestu1 = Student('雷娜', 20, 95) stu1.show()輸出:
一個人被創建 學生被創建 雷娜 202.3.2. 方法的重寫
有的時候,子類希望重寫一下父類的方法,以便實現更多的功能.
代碼:
輸出結果:
一個人被創建 學生被創建 分數是 95 雷娜 20可以看到,重寫之后,就會按照子類寫的方法體來執行.
2.4. 多態
多態的形式:
class Animal:def eat(self):print('動物需要吃東西') class Cat(Animal):def eat(self):print('貓吃魚') class Dog(Animal):def eat(self):print('狗吃shit') class Person:def eat(self):print('人啥都吃')def fun(obj):obj.eat()fun(Animal()) fun(Cat()) fun(Dog()) fun(Person())輸出結果:
動物需要吃東西 貓吃魚 狗吃shit 人啥都吃2.5. 其他筆記
2.5.1. object類
object類中封裝了很多方法,一般用的比較多的之一是 重寫 __str__方法,這樣print打印的時候就會打印str方法中的格式了.
格式是
調用的時候就是print(實例名)
object中還有一些特殊方法,這里推薦去官方查詢API
Python/C 3.9.4 API 參考手冊
著重提一下兩個方法:
__new__()和__init__()
一個是創建類的,一個是用于類的初始化的
2.5.2. 拷貝
變量的賦值操作:只是形成兩個變量,實際上還是指向同一個對象
拷貝有兩種:
淺拷貝:Python拷貝一般都是淺拷貝,拷貝時,對象包含的子對象內容不拷貝,因此,源對象與拷貝對象會引用同一個子對象
用法:
其中stu1是之前已經創建好初始化完畢的類實例,stu2是新的類實例.
深拷貝:使用copy模塊的deepcopy函數,遞歸拷貝對象中包含的子對象,源對象和拷貝對象所有的子對象也不相同.
用法:
有關淺拷貝和深拷貝可以看看這篇:Python 直接賦值、淺拷貝和深度拷貝解析
3. 模塊
參考資料:Python3 模塊
簡單的理解,模塊就是一個函數或者類的集合體.就是一個.py文件
3.1. 定義模塊
1.新建一個.py文件,最好不要和Python自帶的模塊名相同
2.在自己的程序中導入模塊,導入的格式
然后就可以用了,和Java中的導包差不多.
例如:
第一種就是導入所有math模塊中的所有
from math import piprint(pi)第二種就是只導入math中的pi
注意,import方式后邊只能接包名或模塊名,而from的方式可以導入變量
3.2. 主程序運行
在每個模塊的定義中都包括一個記錄模塊名稱的變量__name__,程序可以檢查該變量,以確定他們在哪個模塊中執行。如果一個模塊不是被導入到其它程序中執行,那么它可能在解釋器的頂級模塊中執行。頂級模塊的__name__變量的值為__main__
格式:
這句話的意思是,只有當點擊運行當前.py文件時,pass那的代碼才會運行
3.3. 包
一個Python程序中,可以包含很多包,而每一個包可以包含很多模塊.
包就是一個分層次的目錄結構,包和目錄的區別是,包含__init__.py文件的目錄稱為包,而目錄里通常不包含__init__.py文件
包的導入就是
別名是這個包名.模塊的別名,調用其中的變量應該 別名.變量名
例如
兩句是等效的
3.4. 常用模塊
下面提到的模塊網上都可以查到其用法,推薦官方api
3.5. 第三方模塊的安裝
安裝格式:
pip install 模塊名使用和上面模塊的使用一樣,直接import導入就行了
4. 文件
.py文件在外存中是以UTF-8格式保存的(默認方式),如果要修改文本編碼格式,在py文件最開始加一句#encoding=GBK,注意不要丟掉#符號
本次參考:Python3 File(文件) 方法
4.1. 文件的讀寫
文件操作:
file = open(filename [, mode ,encoding]) print(file.readlines()) file.close()mode是打開方式,encoding是編碼格式.每次文件用完之后記得關閉,和Java/C一樣
打開方式和常用的file方法在菜鳥教程中都有,有需要請點擊上方的網站自行查看
Python中file對象方法中既可以讀也可以寫,比Java方便一些.
4.2. with語句
with語句可以自動管理上下文資源,不論什么原因跳出with塊,都能確保文件正確的關閉,以此來達到釋放資源的目的
格式:
with之后就不用再手動關閉文件,其實主要還是對象實現了__enter__和__exit__方法,就算運行過程中產生了異常,也會調用__exit__退出.
4.3. os模塊
參考資料:os模塊視頻講解
Python3 OS 文件/目錄方法
os是一個目錄操作模塊,os模塊是Python內置的與操作系統功能和文件系統相關的模塊,該模塊中的語句的執行結果通常與操作系統有關,在不同的操作系統上運行,得到的結果可能不一樣,os模塊與os.path模塊用于對目錄或文件進行操作.
os模塊中很多方法都在上方網站里有,有需要的請自行查閱.
總結
Python確實比C/C++ java方便很多,用了大概5天時間快速入門熟悉了基本語法,好在自己學過C,入門python還是比較簡單的.
總結
以上是生活随笔為你收集整理的Python学习之面向对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scsi协议_存储协议有哪些类型?常见存
- 下一篇: python 怎么设置背景为白色_pyc