Python对象基础
類
定義操作
# 1. 定義類class Washer():def wash(self):print('我會洗?服')def print_info(self):# 類??獲取實例屬性print(f'haier1洗?機(jī)的寬度是{self.width}')print(f'haier1洗?機(jī)的?度是{self.height}')# 2. 創(chuàng)建對象 haier1 =Washer() # <__main__.Washer object at 0x0000018B7B224240> print(haier1) # haier1對象調(diào)?實例?法# 3. 添加實例屬性 haier1.width = 500 haier1.height = 800 # 4. 獲取實例的對象 print(f'haier1洗?機(jī)的寬度是{haier1.width}') print(f'haier1洗?機(jī)的?度是{haier1.height}')魔法?法
在Python中, xx() 的函數(shù)叫做魔法?法,指的是具有特殊功能的函數(shù)
1. init()
注意
init() ?法,在創(chuàng)建?個對象時默認(rèn)被調(diào)?,不需要?動調(diào)?
init(self) 中的self參數(shù),不需要開發(fā)者傳遞,python解釋器會?動把當(dāng)前的對象引?傳遞過去。
class Washer():# 定義初始化功能的函數(shù) def __init__(self): # 添加實例屬性self.width = 500self.height = 800 def print_info(self): # 類??調(diào)?實例屬性 print(f'洗?機(jī)的寬度是{self.width}, ?度是{self.height}') haier1 = Washer() haier1.print_info()2.帶參數(shù)的init()
?個類可以創(chuàng)建多個對象,傳參數(shù)對不同的對象設(shè)置不同的初始化屬性
class Washer():def __init__(self, width, height):self.width = widthself.height = heightdef print_info(self):print(f'洗?機(jī)的寬度是{self.width}')print(f'洗?機(jī)的?度是{self.height}') haier1 = Washer(10, 20) haier1.print_info() haier2 = Washer(30, 40) haier2.print_info()3. str__()
當(dāng)使?print輸出對象的時候,默認(rèn)打印對象的內(nèi)存地址。如果類定義了 str ?法,那么就會打印從在這個?法中 return 的數(shù)據(jù)。
class Washer():def __init__(self, width, height):self.width = widthself.height = heightdef __str__(self):return '這是海爾洗?機(jī)的說明書' haier1 = Washer(10, 20) # 這是海爾洗?機(jī)的說明書 print(haier1)4.del()
當(dāng)刪除對象時,python解釋器也會默認(rèn)調(diào)? del() ?法。
class Washer():def __init__(self, width, height):self.width = widthself.height = heightdef __del__(self):print(f'{self}對象已經(jīng)被刪除') haier1 = Washer(10, 20) # <__main__.Washer object at 0x0000026118223278>對象已經(jīng)被刪除 del haier1總結(jié)
-
類
-
創(chuàng)建類
class 類名():代碼
-
-
對象
對象名 = 類名() -
添加對象屬性
- 類外面
- 類??
-
獲取對象屬性
- 類外面
- 類??
-
? 魔法方法
-
init_() : 初始化
-
str__() :輸出對象信息
-
del() :刪除對象時調(diào)?
-
繼承
單繼承
# 1. 師?類 class Master(object):def __init__(self):self.kongfu = '[古法煎餅果?配?]'def make_cake(self):print(f'運?{self.kongfu}制作煎餅果?')# 2. 徒弟類 class Prentice(Master):pass # 3. 創(chuàng)建對象daqiu daqiu = Prentice() # 4. 對象訪問實例屬性 print(daqiu.kongfu) # 5. 對象調(diào)?實例?法 daqiu.make_cake()多繼承
class Master(object):def __init__(self):self.kongfu = '[古法煎餅果?配?]'def make_cake(self):print(f'運?{self.kongfu}制作煎餅果?')# 創(chuàng)建學(xué)校類 class School(object):def __init__(self):self.kongfu = '[??煎餅果?配?]'def make_cake(self):print(f'運?{self.kongfu}制作煎餅果?') class Prentice(School, Master):pass daqiu = Prentice() print(daqiu.kongfu) daqiu.make_cake()注意:當(dāng)?個類有多個?類的時候,默認(rèn)使?第?個?類的同名屬性和?法。
?類和?類具有同名屬性和?法,默認(rèn)使??類的同名屬性和?法。
?類調(diào)??類的方法
class Master(object):def __init__(self):self.kongfu = '[古法煎餅果?配?]'def make_cake(self):print(f'運?{self.kongfu}制作煎餅果?')class School(object):def __init__(self):self.kongfu = '[??煎餅果?配?]'def make_cake(self):print(f'運?{self.kongfu}制作煎餅果?')class Prentice(School, Master):def __init__(self):self.kongfu = '[獨創(chuàng)煎餅果?配?]'def make_cake(self):# 如果是先調(diào)?了?類的屬性和?法,?類屬性會覆蓋?類屬性,故在調(diào)?屬性前,先調(diào)????類的初始化self.__init__()print(f'運?{self.kongfu}制作煎餅果?')# 調(diào)??類?法,但是為保證調(diào)?到的也是?類的屬性,必須在調(diào)??法前調(diào)??類的初始化def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)def make_cake1(self):print(f'運?{self.kongfu}制作煎餅果?')# ?法2.1# super(School, self).__init__()# super(School, self).make_cake()# ?法2.2super().__init__()super().make_cake()daqiu = Prentice() daqiu.make_cake() daqiu.make_master_cake() daqiu.make_school_cake() daqiu.make_cake()super方法
class Prentice(School, Master):def __init__(self):self.kongfu = '[獨創(chuàng)煎餅果?配?]'def make_cake(self):# 如果是先調(diào)?了?類的屬性和?法,?類屬性會覆蓋?類屬性,故在調(diào)?屬性前,先調(diào)????類的初始化self.__init__()print(f'運?{self.kongfu}制作煎餅果?')# 調(diào)??類?法,但是為保證調(diào)?到的也是?類的屬性,必須在調(diào)??法前調(diào)??類的初始化def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)def make_cake1(self):print(f'運?{self.kongfu}制作煎餅果?')# ?法2.1# super(School, self).__init__()# super(School, self).make_cake()# ?法2.2super().__init__()super().make_cake()# ?次性調(diào)??類的同名屬性和?法# 注意:使?super() 可以?動查找?類。調(diào)?順序遵循 __mro__ 類屬性的順序。?較適合單繼承使?。def make_old_cake(self):# ?法?:代碼冗余;?類類名如果變化,這?代碼需要頻繁修改# Master.__init__(self)# Master.make_cake(self)# School.__init__(self)# School.make_cake(self)# ?法?: super()# ?法2.1 super(當(dāng)前類名, self).函數(shù)()# super(Prentice, self).__init__()# super(Prentice, self).make_cake()# ?法2.2 super().函數(shù)()super().__init__()super().make_cake()私有權(quán)限
在Python中,可以為實例屬性和?法設(shè)置私有權(quán)限,即設(shè)置某個實例屬性或?qū)嵗?法不繼承給?類。
設(shè)置私有權(quán)限的?法:在屬性名和?法名 前? 加上兩個下劃線 __
私有屬性和私有?法只能在類??訪問和修改。
在Python中,?般定義函數(shù)名 get_xx ?來獲取私有屬性,定義 set_xx?來修改私有屬性值。
class Master(object): def __init__(self):self.kongfu = '[古法煎餅果?配?]' def make_cake(self):print(f'運?{self.kongfu}制作煎餅果?')class School(object): def __init__(self):self.kongfu = '[??煎餅果?配?]' def make_cake(self):print(f'運?{self.kongfu}制作煎餅果?')class Prentice(School, Master): def __init__(self):self.kongfu = '[獨創(chuàng)煎餅果?配?]'# 定義私有屬性self.__money = 2000000# 定義私有?法 def __info_print(self):print(self.kongfu)print(self.__money) def make_cake(self):self.__init__()print(f'運?{self.kongfu}制作煎餅果?') def make_master_cake(self):Master.__init__(self)Master.make_cake(self) def make_school_cake(self):School.__init__(self)School.make_cake(self) # 徒孫類 class Tusun(Prentice): pass daqiu = Prentice() # 對象不能訪問私有屬性和私有?法 # print(daqiu.__money) # daqiu.__info_print() xiaoqiu = Tusun() # ?類?法繼承?類的私有屬性和私有?法 # print(xiaoqiu.__money) # ?法訪問實例屬性__money # xiaoqiu.__info_print()總結(jié)
-
繼承的特點
- ?類默認(rèn)擁有?類的所有屬性和?法
- ?類重寫?類同名?法和屬性
- ?類調(diào)??類同名?法和屬性
-
super()?法快速調(diào)??類?法
-
私有權(quán)限
- 不能繼承給?類的屬性和?法需要添加私有權(quán)限
- 語法
多態(tài)
類屬性
- 類屬性就是 類對象 所擁有的屬性,它被 該類的所有實例對象 所共有。
- 類屬性可以使? 類對象 或 實例對象 訪問
類屬性的優(yōu)點
-
類的實例 記錄的某項數(shù)據(jù) 始終保持?致時,則定義類屬性。
-
實例屬性要求每個對象為其 單獨開辟?份內(nèi)存空間 來記錄數(shù)據(jù),? 類屬性 為全類所共有,僅占??份內(nèi)存,更加節(jié)省內(nèi)存空間。
修改類屬性
類屬性只能通過類對象修改,不能通過實例對象修改,如果通過實例對象修改類屬性,表示的是創(chuàng)建了?個實例屬性。
class Dog(object):tooth = 10 wangcai = Dog() xiaohei = Dog()# 修改類屬性 Dog.tooth = 12 print(Dog.tooth) # 12 print(wangcai.tooth) # 12 print(xiaohei.tooth) # 12# 不能通過對象修改屬性,如果這樣操作,實則是創(chuàng)建了?個實例屬性 wangcai.tooth = 20 print(Dog.tooth) # 12 print(wangcai.tooth) # 20 print(xiaohei.tooth) # 12實例屬性
class Dog(object):def __init__(self):self.age = 5def info_print(self):print(self.age) wangcai = Dog() print(wangcai.age) # 5 # print(Dog.age) # 報錯:實例屬性不能通過類訪問 wangcai.info_print() # 5類?法和靜態(tài)?法
類?法特點
- 第?個形參是類對象的?法
- 需要?裝飾器 @classmethod 來標(biāo)識其為類?法,對于類?法,第?個參數(shù)必須是類對象,?般以cls 作為第?個參數(shù)。
類?法使?場景
- 當(dāng)?法中 需要使?類對象 (如訪問私有類屬性等)時,定義類?法
- 類?法?般和類屬性配合使?
靜態(tài)?法
靜態(tài)?法特點
-
需要通過裝飾器 @staticmethod 來進(jìn)?修飾,靜態(tài)?法既不需要傳遞類對象也不需要傳遞實例對象(形參沒有self/cls)。
-
靜態(tài)?法 也能夠通過 實例對象 和 類對象 去訪問。
靜態(tài)?法使?場景
- 當(dāng)?法中 既不需要使?實例對象(如實例對象,實例屬性),也不需要使?類對象 (如類屬性、類?法、創(chuàng)建實例等)時,定義靜態(tài)?法
- 取消不需要的參數(shù)傳遞**,有利于 **減少不必要的內(nèi)存占?和性能消耗
總結(jié)
類?法
@classmethod def xx():代碼靜態(tài)?法
@staticmethod def xx():代碼異常
常規(guī)寫法
try:可能發(fā)?錯誤的代碼 except:如果出現(xiàn)異常執(zhí)?的代碼## 常規(guī)寫法 try:print(num) except NameError:print('有錯誤')## 捕獲異常描述信息 try:print(num) except (NameError, ZeroDivisionError) as result:print(result)## 捕獲所有異常 try:print(num) except Exception as result:print(result)## 異常的else ## else表示的是如果沒有異常要執(zhí)?的代碼。 try:print(1) except Exception as result:print(result) else:print('我是else,是沒有異常的時候執(zhí)?的代碼')## 異常的finally ## finally表示的是?論是否異常都要執(zhí)?的代碼,例如關(guān)閉?件 try:f = open('test.txt', 'r') except Exception as result:f = open('test.txt', 'w') else:print('沒有異常,真開?') finally:f.close()異常的傳遞
import time try:f = open('test.txt')try:while True:content = f.readline()if len(content) == 0:breaktime.sleep(2)print(content)except:# 如果在讀取?件的過程中,產(chǎn)?了異常,那么就會捕獲到# ?如 按下了 ctrl+cprint('意外終?了讀取數(shù)據(jù)')finally:f.close()print('關(guān)閉?件') except:print("沒有這個?件")?定義異常
在Python中,拋出?定義異常的語法為 raise 異常類對象 。
# ?定義異常類,繼承Exception class ShortInputError(Exception):def __init__(self, length, min_len):self.length = lengthself.min_len = min_len# 設(shè)置拋出異常的描述信息def __str__(self):return f'你輸?的?度是{self.length}, 不能少于{self.min_len}個字符' def main():try:con = input('請輸?密碼:')if len(con) < 3:raise ShortInputError(len(con), 3)except Exception as result:print(result)else:print('密碼已經(jīng)輸?完成') main()總結(jié)
## 異常語法 try:可能發(fā)?異常的代碼 except:如果出現(xiàn)異常執(zhí)?的代碼 else:沒有異常執(zhí)?的代碼 finally:?論是否異常都要執(zhí)?的代碼## 捕獲異常 except 異常類型:代碼 except 異常類型 as xx:代碼## ?定義異常 # 1. ?定義異常類 class 異常類類名(Exception):代碼# 設(shè)置拋出異常的描述信息def __str__(self):return ... # 2. 拋出異常 raise 異常類名() # 捕獲異常 except Exception...模塊和包
模塊
Python 模塊(Module),是?個 Python ?件,以 .py 結(jié)尾,包含了 Python 對象定義和Python語句。
模塊能定義函數(shù),類和變量,模塊?也能包含可執(zhí)?的代碼。
導(dǎo)?模塊的?式
- import 模塊名
- from 模塊名 import 功能名
- from 模塊名 import *
- import 模塊名 as 別名
- from 模塊名 import 功能名 as 別名
制作模塊
每個Python?件都可以作為?個模塊,模塊的名字就是?件的名字。也就是說?定義模塊名必須要符合標(biāo)識符命名規(guī)則。
## 新建?個Python?件,命名為 my_module1.py ,并定義 testA 函數(shù)。 def testA(a, b):print(a + b) # 只在當(dāng)前?件中調(diào)?該函數(shù),其他導(dǎo)?的?件內(nèi)不符合該條件,則不執(zhí)?testA函數(shù)調(diào)? if __name__ == '__main__':testA(1, 1)## 調(diào)?模塊 import my_module1 my_module1.testA(1, 1)注意
all
如果?個模塊?件中有 all 變量,當(dāng)使? from xxx import * 導(dǎo)?時,只能導(dǎo)?這個列表中的元素。
__all__ = ['testA']def testA():print('testA')def testB():print('testB')## 導(dǎo)?模塊的?件代碼 from my_module1 import * testA() testB()包
包將有聯(lián)系的模塊組織在?起,即放到同?個?件夾下,并且在這個?件夾創(chuàng)建?個名字為 init.py ?件,那么這個?件夾就稱之為包。
新建包
[New] — [Python Package] — 輸?包名 — [OK] — 新建功能模塊(有聯(lián)系的模塊)。
注意:新建包后,包內(nèi)部會?動創(chuàng)建 init.py ?件,這個?件控制著包的導(dǎo)??為。
- 新建包 mypackage
- 新建包內(nèi)模塊: my_module1 和 my_module2
- 模塊內(nèi)代碼如下
導(dǎo)?包
## import 包名.模塊名 ## 包名.模塊名.?標(biāo)import my_package.my_module1 my_package.my_module1.info_print1()## 必須在 __init__.py ?件中添加 __all__ = [] ,控制允許導(dǎo)?的模塊列表。 from my_package import * my_module1.info_print1()達(dá)夢支持
有任何問題請到技術(shù)社區(qū)反饋。
24小時免費服務(wù)熱線:400 991 6599
達(dá)夢技術(shù)社區(qū):https://eco.dameng.com
總結(jié)
以上是生活随笔為你收集整理的Python对象基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Window下VS运行达梦DPI
- 下一篇: go连接达梦数据库