課程:Python面向?qū)ο?br /> 進度:day4
上次內(nèi)容回顧
1. 運算符重載
? 1)算術運算符重載
???? __add__(self,rhs)? obj+3
???? __sub__(self,rhs)? obj-3
???? __mul__(self,rhs)? obj*3
???? __truediv__(self,rhs) obj/3
???? __floordiv__(self,rhs) obj//3
???? __mod__(self,rhs)? obj%3
???? __pow__(self,rhs)? obj**3
????
???? 反向算術運算符: 3+obj
???? 復合算術運算符: obj += 3
?? 2)比較運算符
???? __lt__(self,rhs)?? obj < 3
???? __gt__(self,rhs)?? obj > 3
???? __eq__(self,rhs)?? obj == 3
???? __ne__(self,rhs)?? obj != 3
???? __ge__(self,rhs)?? obj >= 3
???? __le__(self,rhs)?? obj <= 3
????
?? 3)一元運算符:帶一個操作數(shù)
???? __neg__(self)?? -obj
???? __pos__(self)?? +obj
???? __invert__(self)? ~obj
????
?? 4)in,not in
???? __contains__(self,e)
????
?? 5)索引運算符重載
???? __getitem__(self,i)? x=obj[i]
???? __setitem__(self,i,val) obj[i]=x
???? __delitem__(self,i)? del obj[i]
2. 對象的內(nèi)置屬性
?? __dict__: 綁定對象的變量
?? __class__:綁定創(chuàng)建本對象的類
今天的內(nèi)容
1. 類屬性和類方法
?? 1)類屬性(類變量)
???? - 什么是類屬性:屬于類,而不是對象
???? - 可以通過類訪問,也可通過對象訪問
?????? ClassName.attribute? 通過類訪問
?????? objectName.attribute 通過對象訪問
???? - 定義:在類的所有方法之外定義
???? - 特征:類變量為所有實例所共享
? 2)類方法:屬于類而不屬于對象
???? - 定義方式:需要在方法前加@classmethod裝飾器
???? - 特征:第一個參數(shù)不是self, 而是cls
???????????? 綁定調(diào)用該方法的類而不是對象
????????????
???????????? 類方法不能訪問對象屬性
???? - 訪問:類.方法(), 或
????
?? 3)靜態(tài)方法
???? - 什么是靜態(tài)方法:主要處理一些邏輯,
?????? 跟類有一定的相關性,跟類沒有數(shù)據(jù)交互
?????? (不操作類的屬性)
???? - 如何定義靜態(tài)方法:通過@staticmethod
?????? 裝飾器進行定義,不需要傳入self和cls
???? - 調(diào)用:可以通過類或?qū)ο筮M行調(diào)用
???? - 意義:對一些獨立的功能或操作進行
???????????? 歸類存放
????????????
2. 類的預置屬性?
?? 1)__slots__屬性
???? 作用:用來限定屬性的范圍,示例化對象時,
????????? 不允許對象設置__slots__限定外的屬性
????????? 從而防止因?qū)傩蕴顚戝e誤導致的程序錯誤
???? 類型:允許的屬性名稱(字符串)構成的列表
????????? 含有__slots__屬性的類創(chuàng)建的對象
????????? 沒有__dict__內(nèi)置屬性
? 2)__doc__屬性
???? 作用:綁定類中第一個沒有賦值的字符串,
?????????? 可以通過help函數(shù)進行查看。__doc__
?????????? 屬性主要存放類的描述信息
??? 示例:見staff.py
???? 查看:進入python交互模式,執(zhí)行
???????????? from staff import *
???????????? help(Staff)
1 # staff.py
2 # 員工類,演示__slots__屬性示例
3 class Staff:
4 "
這是一個員工類"
5 __slots__ = ["
no", "
name", "
position"]
6
7 def __init__(self, no,
name, position):
8 self.no = no #員工編號
9 self.
name =
name #員工姓名
10 self.position = position #職位
11 #self.salary = 8000 #不允許
12
13 def __str__(self):
14 ret = "
編號:%s, 姓名:%s, 職位:%s" %\
15 (self.no, self.
name, self.position)
16 return ret
17
18 def work(self): #員工工作方法
19 print("
%s正在工作" % self.
name)
20
21 #定義機器人類,繼承自Staff類
22 class ServiceRobot(Staff):
23 def __init__(self, no,
name, position):
24 super().__init__(no,
name, position)
25
26 def work(self): #重寫工作方法
27 print("
%s的工作,掃地" % self.
name)
28
29 if __name__ == "
__main__":
30 staff = Staff("
0001", "
Jerry", "
經(jīng)理")
31 #如果沒有__slots__屬性,則創(chuàng)建一個新屬性
32 #執(zhí)行不會報錯,但沒有起到給屬性賦值的作用
33 #staff.positino = "
副總經(jīng)理"
34 print(staff)
35
36 robot = ServiceRobot("
0002","
多啦A夢","
服務員")
37 print(robot)
38 robot.work()
staff.py 3. 類的關系設計(理解)
?? 1)繼承關系
????? - 描述子類、父類之間的關系
????? - 子類和父類是"是一個XX"的關系
?????
?? 2)組合關系
????? - 一個對象中嵌入了另一個對象
??????? 描述"有一個"的關系
??????? 整體包含部分的關系
?????
?? 3)關聯(lián)關系?
????? - 一個類中嵌套了另一個類,但是這兩個
??????? 類是平等關系,而不是局部和整體的關系
????? - 關聯(lián)可以是單向,也可是雙向
?????
?? ?? 示例代碼:見chain_store.py
1 # staff.py
2 # 員工類,演示__slots__屬性示例
3 class Staff:
4 "
這是一個員工類"
5 __slots__ = ["
no", "
name", "
position"]
6
7 def __init__(self, no,
name, position):
8 self.no = no #員工編號
9 self.
name =
name #員工姓名
10 self.position = position #職位
11 # self.salary = 8000 #不允許
12
13 def __str__(self):
14 ret = "
編號:%s, 姓名:%s, 職位:%s" %\
15 (self.no, self.
name, self.position)
16 return ret
17
18 def work(self): #員工工作方法
19 print("
%s正在工作" % self.
name)
20
21 #定義機器人類,繼承自Staff類
22 class ServiceRobot(Staff):
23 def __init__(self, no,
name, position):
24 super().__init__(no,
name, position)
25
26 def work(self): #重寫工作方法
27 print("
%s的工作,掃地" % self.
name)
28
29 if __name__ == "
__main__":
30 staff = Staff("
0001", "
Jerry", "
經(jīng)理")
31 #如果沒有__slots__屬性,則創(chuàng)建一個新屬性
32 #執(zhí)行不會報錯,但沒有起到給屬性賦值的作用
33 # staff.positino = "
副總經(jīng)理"
34 print(staff)
35
36 robot = ServiceRobot("
0002","
多啦A夢","
服務員")
37 print(robot)
38 robot.work()
staff.py 1 # customer.py
2 # 客戶類
3 class Customer: #客戶類
4 def __init__(self,cust_id,cust_name,tel_no):
5 self.cust_id = cust_id
6 self.cust_name = cust_name
7 self.tel_no = tel_no
8
9 def __str__(self):
10 ret = "
客戶編號:%s,客戶名稱:%s,電話:%s" \
11 %(self.cust_id, self.cust_name, self.tel_no)
12 return ret
customer.py 1 # chain_store.py
2 # 連鎖店類,類屬性/類方法示例
3 from staff
import *
4 from customer
import *
5
6 class ChainStore:
7 #類屬性
8 store_num = 0 #連鎖店門店數(shù)量
9 total_income = 0 #所有門店總營業(yè)額
10 store_list = [] #所有門店對象列表
11 cust_list = [] #所有會員列表
12
13 def __init__(self,store_no,store_name,
14 address, manager):
15 print("
門店開張")
16 self.store_no = store_no #編號
17 self.store_name = store_name #名稱
18 self.address = address #地址
19 self.manager = manager #經(jīng)理
20 self.myincome = 0 #本店營業(yè)額度
21 ChainStore.store_num += 1 #門店開張,總數(shù)量加1
22 ChainStore.store_list.append(self)#添加當前對象到列表
23
24 self.staff_list = [] #連鎖店包含一組員工,組合關系
25
26 def add_staff(self, staff): #添加員工
27 self.staff_list.append(staff)
28
29 def remove_staff(self, no): #刪除員工
30 for staff in self.staff_list:
31 if staff.no == no:
32 self.staff_list.remove(staff)
33
34 def print_all_staff(self): #打印所有員工信息
35 for staff in self.staff_list:
36 print(staff)
37
38 def do_business(self, income): #營業(yè)
39 print("
正在營業(yè)")
40 self.myincome += income #營業(yè)額累加
41 # 將本店的營業(yè)額度累加到總營業(yè)額度
42 ChainStore.total_income += income
43
44 def __str__(self): #重寫__str__()
45 ret="
編號:%s,名稱:%s,地址:%s,店長:%s,總營業(yè)額:%.2f"\
46 %(self.store_no, self.store_name,
47 self.address,self.manager, self.myincome)
48 return ret
49
50 def __del__(self): #析構函數(shù)
51 print("
%s門店關閉" % self.store_name)
52 ChainStore.store_num -= 1 #減少一家門店
53
54 @classmethod
55 def print_total(cls): #類方法,打印類的屬性
56 print("
門店數(shù)量:%d, 營業(yè)總額度:%.2f" %\
57 (cls.store_num, cls.total_income))
58 for store in cls.store_list: #遍歷門店列表
59 print(str(store))
60
61 @staticmethod
62 def print_regulation(): #靜態(tài)方法,打印管理條例
63 regulation = '''
64 --------- 連鎖店管理條例 ---------
65 第一條 考勤
66 第一款 不遲到,不早退,不曠工
67 第二款 有事向經(jīng)理請假
68 ...
69
70 第二條 服務規(guī)范
71 ...
72 '''
73 print(regulation)
74
75 def cust_reg(self, cust): #會員注冊
76 ChainStore.cust_list.append(cust)
77
78 def print_cust_info(self): #打印會員
79 for cust in ChainStore.cust_list:
80 print(cust)
81
82 if __name__ == "
__main__":
83 # 第一家分店
84 store1 = ChainStore("
1","
西單旗艦店","
西單","
Jerry")
85 store1.add_staff(Staff("
0001","
Jerry","
店長"))
86 store1.add_staff(Staff("
0002","
Tom","
Pizza制作師"))
87 store1.add_staff(ServiceRobot("
0003","
哆啦A夢","
服務員"))
88 store1.print_all_staff() #打印所有員工信息
89
90 store1.do_business(20000) #營業(yè)
91 ChainStore.print_total() #調(diào)用類方法
92 print("
")
93 store1.cust_reg(Customer("
1","
八戒","
13522334455"))
94 store1.cust_reg(Customer("
2","
悟空","
13899887766"))
95 store1.print_cust_info() #打印會員信息
96
97 #
print("
")
98 # # 第二家分店
99 store2 = ChainStore("
2","
中關村店","
中關村","
李小小")
100 store2.do_business(25000) #營業(yè)
101 del store2 #銷毀store2對象
102
103 print("
程序退出")
104 # ChainStore.print_total() #調(diào)用類方法
105
106 # ChainStore.print_regulation() #通過類調(diào)用靜態(tài)方法
107 # store2.print_regulation() #通過對象調(diào)用靜態(tài)方法
108 chain_store.py4. with語句
?? 1)作用:在訪問某些資源時,不管有沒有發(fā)生
????? 異常,都確保能夠執(zhí)行必須的清理操作,
????? 并釋放資源(類似于try-finally作用)
?? 2)語法
????? with 表達式1 [as 變量1][,表達式2 [as 變量2]]
???????? 語句塊
????? 例如:文件打開后自動關閉
??????????? 線程資源的釋放(系統(tǒng)編程階段學習)
? 3)實現(xiàn)原理:環(huán)境資源管理器(上下文管理器)
???? - 定義了__enter__()和__exit__()方法的
?????? 對象稱為環(huán)境資源管理器
???? - 調(diào)用時機:__enter__()方法在with語句被
???????????????? 執(zhí)行時調(diào)用
???????????????? __exit__()方法with語句結束時被調(diào)用
??? - 格式:
?????? __enter__(self)?? 略
?????? __exit__(self, exc_type, exc_val, exc_tb)
???????? 參數(shù):exc_type 異常類型,沒有異常為None
????????????? exc_val 綁定異常對象,沒有異常為None
????????????? exc_tb 綁定TrackBack對象,沒有異常為None
1 aaa
2 bbb
3 ccc
4 a.txt 1 # with.py
2 # with語句示例
3 # try:
4 # #f =
open("
aaa.txt", "
rt")
5 # # 使用with語句,不管以下的操作是否
6 # # 發(fā)生異常,都能保證文件被正確關閉
7 # with
open("
a.txt", "
rt") as f:
8 # for line in f:
9 #
print(line,
end="
")
10 # # with語句結束
11 # except:
12 #
print("
文件操作失敗")
13
14 class A: #自定義資源管理器
15 def __init__(self,
name):
16 self.
name =
name
17
18 def __enter__(self):
19 print("
__enter__()方法被執(zhí)行")
20 return self
21
22 def __exit__(self,
exc_type, exc_val,exc_tb):
23 print("
__exit__()方法被執(zhí)行")
24 if exc_type is None: #沒有出現(xiàn)異常
25 print("
沒有出現(xiàn)異常")
26 else: # 出現(xiàn)異常
27 print("
錯誤類型:",
exc_type)
28 print("
錯誤對象:", exc_val)
29 print("
TraceBack:", exc_tb)
30
31 if __name__ == "
__main__":
32 with A("
test_name") as a:
33 print("
with語句執(zhí)行了")
34 # 制造或不制造異常
35 a = int(input("
請輸入一個數(shù)字:"))
36
37 print("
程序退出")
with.py 作業(yè):
編寫一個程序,模擬掃福,各種福的概率如下:
愛國福 30%
敬業(yè)福 10%
和諧福 30%
友善福 20%
富強福 10%
編寫代碼進行模擬
轉(zhuǎn)載于:https://www.cnblogs.com/shengjia/p/10387711.html
總結
以上是生活随笔為你收集整理的PYTHON1.面向对象_day04的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。