?向?qū)ο?oop) 是?種編程?法, 編程思想(即指導(dǎo)如何寫(xiě)代碼), 適?于 中?型項(xiàng)?
?向過(guò)程也是?種編程思想, 適?于?型項(xiàng)?
?向過(guò)程 和 ?向?qū)ο?都可以實(shí)現(xiàn)某個(gè)編程的?的.
?向過(guò)程 考慮的是 實(shí)現(xiàn)的細(xì)節(jié)
?向?qū)ο?考慮的是 結(jié)果(誰(shuí)能做這件事)
面向?qū)ο蟮暮诵膬?nèi)容 類 和 對(duì)象
class定義的蘋(píng)果 ----> 類
紅蘋(píng)果 ----> 類
?明??的那個(gè)紅蘋(píng)果 ----> 對(duì)象
狗 ----> 類
??狗 -----> 類
李四家的那條 ??狗 -----> 對(duì)象
類 :就是模具。擁有一定的整體特征。
對(duì)象:符合模具的要求,有具體的實(shí)現(xiàn)。
當(dāng)我們把一大堆擁有共同特征的對(duì)象的靜態(tài)特征(屬性)和動(dòng)態(tài)特征(行為)都抽離出來(lái)后,就可以定義出一個(gè)叫做“類”的東西。

想要設(shè)計(jì)一個(gè)類, 通常需要滿足以下三個(gè)要素:
- 類名: 同類事物的名字, 命名要滿足大駝峰命名法
- 屬性: 同類事物具備的特征
- 方法: 同類事物具備的行為
1, 設(shè)計(jì)類 (找類的三要素)
2, 定義類
3, 創(chuàng)建對(duì)象(實(shí)例化對(duì)象)
4, 由對(duì)象調(diào)?類中的?法
類的設(shè)計(jì) 就是找三要素. 屬性和?法 可能會(huì)有很多,我們只需要
找到關(guān)注的即可
類名的提取:使?名詞提煉法 分析整個(gè)業(yè)務(wù)流程, 得出的名詞,
通 常就是類名
?:對(duì)于需求中沒(méi)有提到的屬性和方法, 在設(shè)計(jì)類的時(shí)候不要添加進(jìn)來(lái)!
類的設(shè)計(jì)-案例演練1
需求:
? 小明 今年 18 歲,身高 1.75,每天早上 跑 完步,會(huì)去 吃 東西
? 小美 今年 17 歲,身高 1.65,小美不跑步,小美喜歡 吃 東西
類名 :Person
屬性 :name , age ,height
方法 :run , eat
類的設(shè)計(jì)-練習(xí)1
需求:
? 一只 黃顏色 的 狗狗 叫 大黃
? 看見(jiàn)生人 汪汪叫
? 看見(jiàn)家人 搖尾巴
類名 :Dog
屬性 :color , name
方法 :汪汪叫(bark) , 搖尾巴(shake)
類的設(shè)計(jì)-案例演練2
需求:
? 進(jìn)入某 Web 項(xiàng)目登錄頁(yè)面,輸入用戶名、密碼、驗(yàn)證碼之后,點(diǎn)擊登錄按鈕可以登錄系統(tǒng)
類名 :LoginPage
屬性 :username , paasword ,code ,登錄按鈕
方法 :登錄方法
類的設(shè)計(jì)-練習(xí)2
需求:
進(jìn)入某APP項(xiàng)目的下訂單頁(yè)面,輸入用戶收貨地址后,點(diǎn)擊提交訂單按鈕,可以實(shí)現(xiàn)下單操作
類名 :Page
屬性 :用戶收貨地址 , 提交訂單按鈕
方法 :下單方法
在Python 中定義類使?關(guān)鍵字 class
# 類名: 遵循大駝峰命名法
class 類名:
# 方法: 定義方式與函數(shù)基本相同, 區(qū)別是方法的第一個(gè)參數(shù)必須為 self
def 方法1(self, 參數(shù)列表):
pass
def 方法2(self, 參數(shù)列表):
pass
在代碼中, 對(duì)象是由類對(duì)象.
類名() # 就是創(chuàng)建對(duì)象
# ?般使?變量將創(chuàng)建的對(duì)象保存起來(lái)
變量 = 類名() # ?般將這個(gè)變量 稱為是對(duì)象, 本質(zhì)-->變量中保存的是對(duì)象的引?地址
案例一
需求:小貓 愛(ài) 吃魚(yú),小貓 要 喝水
類名 :Cat
屬性 :/
方法 :吃魚(yú)eat ; 喝水drink
class Cat:
def eat(self):
"""吃?的?法"""
print("吃魚(yú)")
def drink(self):
"""喝?的?法"""
print("喝水")
tom = Cat()
tom.drink()
tom.eat()
1, 參函數(shù)的語(yǔ)法上來(lái)看, self 是形參, 名字可以任意的變量
名, 只是我們習(xí)慣性叫 self
2, 特殊點(diǎn): self 是?個(gè)普通的參數(shù), 按照函數(shù)的語(yǔ)法,在調(diào)?的時(shí)候,必須傳遞實(shí)參值, 原因, 是 Python 解釋器?動(dòng)的將 調(diào)?這個(gè)?法的對(duì)象作為參數(shù)傳遞給 self 所以 self 就是調(diào)?這個(gè)?法對(duì)象
class Cat:
def eat(self): # self 是調(diào)?這個(gè)?法的對(duì)象
"""吃?的?法"""
print(f'self:{id(self)}')
print('?貓愛(ài)吃?...')
# 創(chuàng)建對(duì)象
tom = Cat()
# 通過(guò)對(duì)象 調(diào)?類中的?法
print(f"tom :{id(tom)}")
tom.eat() # tom 調(diào)? ,self 就是 Tom
blue_cat = Cat()
print(f'blue:{id(blue_cat)}')
blue_cat.eat() # blue_cat 調(diào)?, self 就是 blue_cat
屬性表示事物的特征.
可以給對(duì)象添加屬性 或者獲取對(duì)象的屬性值.
給對(duì)象添加屬性:
對(duì)象.屬性名 = 屬性值 # 添加或者修改
獲取對(duì)象的屬性值:
對(duì)象.屬性名
在?法中操作屬性(self 是對(duì)象):
self.屬性名 = 屬性值
self.屬性名
class Cat:
def eat(self): # self 是調(diào)?這個(gè)?法的對(duì)象
"""吃?的?法"""
print(f'self:{id(self)}')
print(f'?貓{self.name}愛(ài)吃?...')
# 創(chuàng)建對(duì)象
tom = Cat()
tom.name = '湯姆' #------->在類的外面定義屬性
print(tom.name)
tom.eat()
blue_cat = Cat()
print(f'blue:{id(blue_cat)}')
blue_cat.name = '藍(lán)貓'
blue_cat.eat()
練習(xí):
Cat 添加屬性 姓名, 年齡
eat ?法中打印輸出 ?貓 xx, xx 歲 愛(ài)吃?
class Cat:
def eat(self): # self 是調(diào)?這個(gè)?法的對(duì)象
"""吃?的?法"""
print(f'self:{id(self)}')
print(f'?貓{self.name},{self.age}歲 愛(ài)吃?...')
tom=Cat()
tom.name="xx"
tom.age="xx"
tom.eat()
在類的內(nèi)部定義屬性??
在 python 中存在一類方法,以兩個(gè)下劃線開(kāi)頭,兩個(gè)下劃線結(jié)尾,在滿足某個(gè)條件的情況下,會(huì)自動(dòng)調(diào)用,這一類方法 稱為魔法方法
學(xué)習(xí):
1:什么情況下會(huì)自動(dòng)調(diào)用(自動(dòng)調(diào)用的時(shí)機(jī))
2:應(yīng)用場(chǎng)景
3:注意事項(xiàng)
__init__1, 調(diào)?時(shí)機(jī)
在創(chuàng)建對(duì)象之后,會(huì)?動(dòng)調(diào)?.
2, 應(yīng)?場(chǎng)景
初始化對(duì)象, 給對(duì)象添加屬性
3, 注意事項(xiàng)
- 不要寫(xiě)錯(cuò)
- 如果 屬性是會(huì)變化的, 則可以將這個(gè)屬性的值作為參數(shù)傳遞, 在創(chuàng)建對(duì)象的時(shí)候,必須傳遞實(shí)參值
class Cat:
def __init__(self, name, age):
'''添加屬性'''
self.name = name
self.age = age
def eat(self):
"""吃?的?法"""
print(f'self:{id(self)}')
print(f'?貓{self.name},{self.age}歲 愛(ài)吃?...')
tom=Cat("tom","18")
tom.eat() #?貓tom,18歲 愛(ài)吃?...
# init ?法 創(chuàng)建對(duì)象之后 會(huì)?動(dòng)調(diào)?
# 1 會(huì) 2 不會(huì)
# Cat # 2 不是創(chuàng)建對(duì)象
# Cat() # 1 因?yàn)槭莿?chuàng)建對(duì)象
# tom = Cat # 2 不是創(chuàng)建對(duì)象, 即 tom 也是類
#
# blue = Cat() # 1 創(chuàng)建對(duì)象
# b = blue # 2 不是創(chuàng)建對(duì)象, 只是引?的傳遞
#
# t = tom() # 1, tom 已經(jīng)是類, 類名() 就是創(chuàng)建對(duì)象
__str__方法1:調(diào)?時(shí)機(jī)
使? print(對(duì)象) 打印對(duì)象的時(shí)候, 會(huì)?動(dòng)調(diào)?
1, 如果沒(méi)有定義 __str__ ?法, 默認(rèn)打印的是 對(duì)象的引?地址
2, 如果定義 __str__ ?法,打印的是 ?法的返回值
2:應(yīng)?場(chǎng)景
使? print(對(duì)象) 打印輸出對(duì)象的屬性信息
3:注意事項(xiàng)
必須返回?個(gè) 字符串

class Cat:
def __init__(self, name, age):
'''添加屬性'''
self.name = name
self.age = age
def __str__(self): # ?般不使? print,直接返回
return f"姓名: {self.name}, 年齡: {self.age}"
tom=Cat("tom","18")
print(tom)
dir()函數(shù)
dir(對(duì)象變量)
作用:可以查看對(duì)象內(nèi)的 所有屬性及方法
注意:dir()函數(shù)不具備輸出功能, 需要和print()函數(shù)配合使用

封裝: 根據(jù)要求將屬性和?法 定義到類中(定義類)
封裝案例一:小明愛(ài)跑步
需求:
? 小明 體重 75.0 公斤
? 小明每次 跑步 會(huì)減肥 0.5 公斤
? 小明每次 吃東西 體重增加 1 公斤

class Person:
def __init__(self,name,weight):
self.name=name
self.weight=weight
def __str__(self):
return f"{self.name}現(xiàn)在的體重為{self.weight}kg"
def run(self):
self.weight=self.weight-0.5
print(f"{self.name}跑步后體重為{self.weight}kg")
def eat(self):
self.weight=self.weight+1
print(f"{self.name}吃東西后體重為{self.weight}kg")
xm=Person("小明",85)
print(xm) #小明現(xiàn)在的體重為85kg
xm.run() #小明跑步后體重為84.5kg
xm.eat() #小明吃東西后體重為85.5kg
同一個(gè)類 創(chuàng)建的 多個(gè)對(duì)象 之間,屬性 互不干擾!
if __name__ == '__main__':
xm=Person("小明",85)
print(xm)
xm.run()
xm.eat()
xiaomei = Person("小美", 45)
xiaomei.run()
xiaomei.run()
xiaomei.eat()
print(xiaomei)
封裝案例二:登錄
需求:
? 進(jìn)入某 Web 項(xiàng)目登錄頁(yè)面,輸入用戶名、密碼、驗(yàn)證碼之后登錄系統(tǒng)
class Login:
def __init__(self, username, password, code):
self.username = username
self.password = password
self.code = code
if code == "8888":
if username == "張三" and password == "123456":
print("登錄成功!")
else:
print("賬號(hào)或密碼錯(cuò)誤!")
else:
print("驗(yàn)證碼錯(cuò)誤!")
if __name__ == '__main__':
zq = Login("張三", "123456", "8888")
mm = Login("張三", "123476", "8888")
yzm = Login("張三", "123456", "8877")
yhm = Login("王五", "123456", "8888")
class LoginPage:
def __init__(self, username, password, code):
self.username = username
self.password = password
self.code = code
def Login(self):
print(f"1.輸入用戶名:{self.username}")
print(f"2.輸入密碼:{self.password}")
print(f"3.輸入驗(yàn)證碼:{self.code}")
print(f"4.點(diǎn)擊登錄")
if self.code == "8888":
if self.username == "張三" and self.password == "123456":
print("登錄成功!")
else:
print("賬號(hào)或密碼錯(cuò)誤!")
else:
print("驗(yàn)證碼錯(cuò)誤!")
if __name__ == '__main__':
admin = LoginPage("張三", "123456", "8888")
admin.Login()
hm = LoginPage("XX", "123456", "8888")
hm.Login()
mm = LoginPage("張三", "XXXXX", "8888")
mm.Login()
yzm = LoginPage("張三", "123456", "XXXX")
yzm.Login()
封裝案例三:擺放家具
需求:
1. 房子(House) 有 戶型、總面積 和 家具名稱列表
– 新房子沒(méi)有任何的家具
2. 家具(HouseItem) 有 名字 和 占地面積,其中
– 席夢(mèng)思(bed) 占地 4 平米
– 衣柜(chest) 占地 2 平米
– 餐桌(table) 占地 1.5 平米
3. 將以上三件 家具 添加 到 房子 中
4. 打印房子時(shí),要求輸出:戶型、總面積、剩余面積、家具名稱列表
class HouseItem:
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return f"{self.name} 占地 {self.area}平方"
if __name__ == '__main__':
bed = HouseItem('席夢(mèng)思', 4)
chest = HouseItem('?柜', 2)
table = HouseItem('餐桌', 1.5)
print(bed)
print(chest)
print(table)
class House:
def __init__(self, house_type, area):
self.house_type = house_type
self.area = area
self.free_area=area
self.item_name_list=[]
def __str__(self):
return f"戶型:{self.house_type}、面積:{self.area}、剩余面積{self.free_area}、家具名稱列表{self.item_name_list}"
def add_item(self,item):
if self.free_area > item.area:
print(f'添加家具: {item.name}')
self.item_name_list.append(item.name)
# 修改剩余?積
self.free_area -= item.area
else:
print(f"房?剩余?積不?,換個(gè)?房? 吧.....")
# 創(chuàng)建房?
house = House('三室?廳', 100)
print(house)
house.add_item(bed)
print(house)
house.add_item(chest)
print(house)
house.add_item(table)
print(house)
1, 繼承描述的是類與類之間的關(guān)系 is ... a
2, 繼承的好處: 減少代碼冗余,重復(fù)代碼不需要多次書(shū)寫(xiě), 提高編程效率
# class 類A(object):
# class 類A():
class 類A: # 默認(rèn)繼承 object 類, object 類 Python 中最原始的類
pass
class 類B(類A): # 就是繼承, 類 B 繼承 類 A
pass
# 類 A: 父類 或 基類
# 類 B: 子類 或 派生類
子類繼承父類之后, 子類對(duì)象可以直接使用父類中的屬性和方法
說(shuō)明:
? C 類從 B 類繼承, B 類又從 A 類繼承
? 那么 C 類就擁有 B 類和 A 類的所有屬性和方法
結(jié)論: 子類擁有父類以及父類的父類中封裝的所有屬性和方法
對(duì)象調(diào)用方法的順序: 對(duì)象.方法名()
1, 會(huì)現(xiàn)在自己的類中查找, 找到直接使用
2, 沒(méi)有找到 去父類中查找, 找到直接使用
3, 沒(méi)有找到, 在父類的父類中查找, 找到直接使用
4, 沒(méi)有找到, ...
5, 直到 object 類, 找到直接使用, 沒(méi)有找到,報(bào)錯(cuò)
繼承案例
需求:
1. 定義動(dòng)物類,動(dòng)物有姓名和年齡屬性,具有吃和睡的行為
2. 定義貓類,貓類具有動(dòng)物類的所有屬性和方法,并且具有抓老鼠的特殊行為
3. 定義狗類,狗類具有動(dòng)物類的所有屬性和方法,并且具有看門(mén)的特殊行為
4. 定義哮天犬類,哮天犬類具有狗類的所有屬性和方法,并且具有飛的特殊行為
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name}吃吃吃")
def sleep(self):
print(f"{self.name}睡睡睡")
class Cat(Animal):
def catch(self):
print(f"{self.name}抓老鼠")
class Dog(Animal):
def door(self):
print(f"{self.name}看門(mén)")
class xtq(Dog):
def fly(self):
print(f"{self.name}起飛")
if __name__ == '__main__':
tom = Cat("湯姆", 2)
tom.eat()
tom.sleep()
tom.catch()
dh = Dog("大黃", 3)
dh.eat()
dh.sleep()
dh.door()
xtq = xtq("神犬", 100)
xtq.eat()
xtq.sleep()
xtq.door()
xtq.fly()
1, 什么是重寫(xiě)?
重寫(xiě)是在子類中定義了和父類中名字一樣的方法.
2, 重寫(xiě)的原因? 為什么重寫(xiě)?
父類中的代碼不能滿足子類對(duì)象的需要
3, 重寫(xiě)的方式
3.1 覆蓋式重寫(xiě)
3.2 擴(kuò)展式重寫(xiě)
覆蓋式重寫(xiě)
父類中的功能全部不要.
直接在子類中定義和父類中方法名字一樣的方法接口, 直接書(shū)寫(xiě)新的代碼.
class Dog:
def bark(self):
print('汪汪汪叫......')
class XTQ(Dog): # 需要哮天犬 嗷嗷嗷叫, 父類中的 bark 方法,不能滿足子類對(duì)象的需要, 覆蓋式重寫(xiě)
def bark(self):
print('嗷嗷嗷叫.....')
pass
if __name__ == '__main__':
xtq = XTQ()
xtq.bark()
擴(kuò)展式重寫(xiě)
父類中的功能還需要,只是添加了新的功能
方法:
1. 先在子類中定義和父類中名字相同的方法
2. 在子類的代碼中 使用 super().方法名() 調(diào)用父類中的功能
3. 書(shū)寫(xiě)新的功能
class Dog:
def bark(self):
print('汪汪汪叫......')
class XTQ(Dog): # 需要哮天犬 嗷嗷嗷叫, 父類中的 bark 方法,不能滿足子類對(duì)象的需要, 覆蓋式重寫(xiě)
def bark(self):
super().bark()
print('嗷嗷嗷叫.....')
pass
if __name__ == '__main__':
xtq = XTQ()
xtq.bark()
多態(tài): 調(diào)用代碼的技巧
---就是通過(guò)定義方法,重寫(xiě)方法,造成多個(gè)狀態(tài),引用不同狀態(tài)得到不同結(jié)果
多態(tài):不同的子類對(duì)象調(diào)用相同的父類方法,產(chǎn)生不同的執(zhí)行結(jié)果
多態(tài)案例:
需求:
1. 在 Dog 類中封裝方法 game
– 普通狗只是簡(jiǎn)單的玩耍
2. 定義 XiaoTianDog 繼承自 Dog,并且重寫(xiě) game 方法
– 哮天犬需要在天上玩耍
3. 定義 Person 類,并且封裝一個(gè) 和狗玩 的方法
– 在方法內(nèi)部,直接讓 狗對(duì)象 調(diào)用 game 方法
class Dog:
def game(self):
print('普通狗簡(jiǎn)單的玩耍...')
class XTQ(Dog):
def game(self):
print('哮天犬在天上玩耍...')
class Person:
def play_with_dog(self, dog):
"""dog 是狗類或者其子類的對(duì)象"""
print('人和狗在玩耍...', end='')
dog.game()
if __name__ == '__main__':
dog1 = Dog()
xtq = XTQ()
xw = Person()
xw.play_with_dog(dog1)
xw.play_with_dog(xtq)
在Python 中,定義類的時(shí)候, 可以給 屬性和方法設(shè)置 訪問(wèn)權(quán)限, 即規(guī)定在什么地方可以使用.
權(quán)限一般分為兩種: 公有權(quán)限 私有權(quán)限
直接定義的屬性和方法就是公有的
可以在任何地方訪問(wèn)和使用,只要有對(duì)象就可以訪問(wèn)和使用
1,只能在類內(nèi)部定義(class關(guān)鍵字的縮進(jìn)中)
2,只需要在屬性名 或者方法名掐滅加兩個(gè)下劃線,這個(gè)方法或者屬性就變?yōu)樗接械?
私有 只能在當(dāng)前類的內(nèi)部使用. 不能在類外部和子類直接使用
一般來(lái)說(shuō),定義的屬性和方法 都為公有的.
某個(gè)屬性 不想在外部直接使用, 定義為私有
某個(gè)方法,是內(nèi)部的方法(不想在外部使用), 定義為私有
"""定義人類, name 屬性 age 屬性(私有)"""
class Person:
def __init__(self, name, age):
self.name = name # 公有
self.__age = age # 公有-->私有, 在屬性名前加上兩個(gè)下劃線
def __str__(self): # 公有方法
return f"{self.name}, {self.__age}"
def set_age(self, age): # 定義公有方法,修改私有屬性
if age < 0 or age > 120:
print('提供的年齡信息不對(duì)')
return
self.__age = age
if __name__ == '__main__':
xw = Person('小王', 18)
print(xw)
xw.__age = 10000 # 添加一個(gè)公有屬性 __age
print(xw)
xw.set_age(10000)
print(xw)
python 中一切皆對(duì)象
類對(duì)象
類對(duì)象 就是 類, 就是使用 class 定義的類
在代碼執(zhí)行的時(shí)候, 解釋期會(huì)自動(dòng)的創(chuàng)建.
作用:
1, 使用類對(duì)象創(chuàng)建 實(shí)例對(duì)象
2, 存儲(chǔ)一些類的特征值(類屬性)
實(shí)例對(duì)象
1, 創(chuàng)建對(duì)象也稱為實(shí)例化, 所以 由類對(duì)象(類) 創(chuàng)建的對(duì)象 稱為是 實(shí)例對(duì)象, 簡(jiǎn)稱實(shí)例
2, 一般來(lái)說(shuō),沒(méi)有特殊強(qiáng)調(diào),我們所說(shuō)的對(duì)象 都是指 實(shí)例對(duì)象(實(shí)例)
3, 實(shí)例對(duì)象 可以保存實(shí)例的特征值 (實(shí)例屬性)
4, 就是使用 類名() 創(chuàng)建的對(duì)象
使用 實(shí)例對(duì)象.屬性 訪問(wèn) 屬性的時(shí)候, 會(huì)先在 實(shí)例屬性中查找,如果找不到,去類屬性中查找, 找到就使用, 找不到,就報(bào)錯(cuò)
即: 每個(gè)實(shí)例對(duì)象 都有可能訪問(wèn)類屬性值(前提,實(shí)例屬性和類屬性不重名)
實(shí)例屬性
概念
是每個(gè)實(shí)例對(duì)象 具有的特征(屬性), 每個(gè)實(shí)例對(duì)象的特征
定義
一般都是在 init 方法中,使用 self.屬性名 = 屬性值 來(lái)定義
特征(內(nèi)存)
每個(gè)實(shí)例對(duì)象 都會(huì)保存自己的 實(shí)例屬性, 即內(nèi)存中存在多份
訪問(wèn)和修改
# 可以認(rèn)為是通過(guò) self
實(shí)例對(duì)象.屬性 = 屬性值 # 修改
實(shí)例對(duì)象.屬性 # 訪問(wèn)
類屬性
概念
是類對(duì)象具有的 特征, 是整個(gè)類的特征
定義
一般 在類的內(nèi)部(class 縮進(jìn)中), 方法的外部(def 的縮進(jìn)外部) 定義的變量
特征(內(nèi)存)
只有類對(duì)象保存一份, 即在內(nèi)存中只有一個(gè)
訪問(wèn)和修改
# 即通過(guò)類名
類對(duì)象.屬性 = 屬性值
類對(duì)象.屬性
什么時(shí)候 定義類屬性?
代碼中 使用的屬性 基本上 都是 實(shí)例屬性,即都通過(guò) self 定義.
當(dāng) 某個(gè)屬性值描述的信息是整個(gè)類的特征(這個(gè)值變動(dòng),所有的這個(gè)類的對(duì)象這個(gè)特征都會(huì)發(fā)生變化)
案例
1. 定義一個(gè) 工具類
2. 每件工具都有自己的 name
3. 需求 —— 知道使用這個(gè)類,創(chuàng)建了多少個(gè)工具對(duì)象?
類名: Tool
屬性: name(實(shí)例屬性) count(類屬性)
方法: init 方法
class Tool:
# 定義類屬性 count,記錄創(chuàng)建對(duì)象的個(gè)數(shù)
count = 0
def __init__(self, name):
self.name = name # 實(shí)例屬性, 工具的名字
# 修改類屬性的值
Tool.count += 1
if __name__ == '__main__':
# 查看 創(chuàng)建對(duì)象的個(gè)數(shù)
print(Tool.count) # 查看類屬性
tool1 = Tool('錘子')
print(Tool.count)
tool2 = Tool('扳手')
print(Tool.count)
print(tool2.count) # 先找實(shí)例屬性 count, 找不到, 找類屬性 count, 找到,使用
實(shí)例方法
定義時(shí)機(jī)
如果方法中 需要使用 實(shí)例屬性, 則這個(gè)方法 **必須** 定義為實(shí)例方法
定義
# 直接定義的方法就是實(shí)例方法
class 類名:
def 方法名(self):
pass
參數(shù)
參數(shù)一般寫(xiě)作 self, 表示的是 實(shí)例對(duì)象
調(diào)用
實(shí)例對(duì)象.方法名()
類方法
定義時(shí)機(jī)
如果 方法中 不需要使用 實(shí)例屬性, 但需要使用 類屬性, 則這個(gè)方法 **可以** 定義為 類方法(建議)
定義
# 定義類方法,需要在方法名上方 書(shū)寫(xiě) @classmethod , 即使用 @classmethod 裝飾器裝飾
class 類名:
@classmethod
def 方法名(cls):
pass
參數(shù)
參數(shù) 一般寫(xiě)作 cls, 表示類對(duì)象, 即 類名, 同樣不需要手動(dòng)傳遞,Python 解釋器會(huì)自動(dòng)傳遞
調(diào)用
# 方法一
類名.方法名()
# 方法二
實(shí)例對(duì)象.方法名()
? 靜態(tài)方法
定義時(shí)機(jī)
方法中即不需要使用 實(shí)例屬性, 也不需要使用 類屬性, **可以** 將這個(gè)方法定義為 靜態(tài)方法
定義
# 定義靜態(tài)方法, 需要使用 裝飾器 @staticmethod 裝飾方法
class 類名:
@staticmethod
def 方法名():
pass
參數(shù)
靜態(tài)方法,對(duì)參數(shù)沒(méi)有要求, 一般沒(méi)有
調(diào)用
# 方法一
類名.方法名()
# 方法二
實(shí)例對(duì)象.方法名()
需求:
1. 設(shè)計(jì)一個(gè) Game 類
2. 屬性:
? 定義一個(gè) top_score 類屬性 -> 記錄游戲的歷史最高分
? 定義一個(gè) player_name 實(shí)例屬性 -> 記錄當(dāng)前游戲的玩家姓名
3. 方法:
? 靜態(tài)方法 show_help() -> 顯示游戲幫助信息
? 類方法 show_top_score() -> 顯示歷史最高分
? 實(shí)例方法 start_game() -> 開(kāi)始當(dāng)前玩家的游戲
- ① 使用隨機(jī)數(shù) 生成 10-100 之間數(shù)字 作為本次游戲的得分
- ② 打印本次游戲等分 : 玩家 xxx 本次游戲得分 ooo
- ② 和歷史最高分進(jìn)行比較, 如果比歷史最高分高, 修改歷史最高分
4. 主程序步驟: main
1 查看幫助信息
2 查看歷史最高分
3 創(chuàng)建游戲?qū)ο螅_(kāi)始游戲
4 再一次游戲
import random
class Game:
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
@staticmethod
def show_help():
print("幫助你一下")
@classmethod
def show_top_score(cls):
print(f"最高分{Game.top_score}")
def start_game(self):
print("開(kāi)始游戲")
max2 = random.randint(10, 100)
print(f"{self.player_name}本場(chǎng)得分{max2}")
if max2 > Game.top_score:
Game.top_score = max2
if __name__ == '__main__':
Game.show_help()
Game.show_top_score()
xm = Game("小明")
xm.start_game()
Game.show_top_score()
xh = Game("小h")
xh.start_game()
Game.show_top_score()
上面代碼每次執(zhí)行,top_score 都會(huì)重新賦值為0。為解決數(shù)據(jù)一直保存,引入 文件
(下一篇筆記)