# 面向?qū)ο笫且环N編程思想,還有另一種是面向過程
# 面向過程,具體步驟的實(shí)現(xiàn),所有功能都自己書寫
# 面向?qū)ο?使用一個(gè)個(gè)工具(函數(shù)),幫助完成各項(xiàng)任務(wù)
# 類:對(duì)多個(gè)特性相同或相似的食物的統(tǒng)稱,根據(jù)特征不同一個(gè)事物可以屬于多個(gè)類
# 對(duì)象:由類實(shí)例化的一個(gè)事物,指代1個(gè)
# 類的組成:類名(大駝峰),屬性即類的特征,方法即類要做什么事
# 類的抽象:找到類名,屬性和方法
"""
1.定義類:定義前先設(shè)計(jì)類
2.創(chuàng)建對(duì)象:使用第一步定義的類創(chuàng)建對(duì)象
3.通過對(duì)象調(diào)用方法
"""# 定義類
class Person:def run(self): # 方法的本質(zhì)是在類中定義的函數(shù),只不過要帶一個(gè)self參數(shù)print("跑起來")print(id(self))# 創(chuàng)建對(duì)象Person()形式即可創(chuàng)建對(duì)象,只不過這樣不能使用,需要一個(gè)變量把對(duì)象保存起來
# 變量 = 類名()形式,變量中保存的是對(duì)象的引用,可以說變量a就是對(duì)象A
# 一個(gè)類可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象的地址都不一樣
xiaoming = Person()
# 調(diào)用對(duì)象
xiaoming.run()# self:從函數(shù)的語法上說,self是形參,可以是任意變量名,只不過習(xí)慣將它寫作self
# self是普通形參,但調(diào)用的時(shí)候可以不傳遞實(shí)參值,不符合函數(shù)語法.
# 實(shí)際是Python解釋器在調(diào)用這個(gè)方法的時(shí)候自動(dòng)將調(diào)用這個(gè)方法的對(duì)象,即xiaoming,傳遞給self
# 所以self本質(zhì)是一個(gè)對(duì)象.驗(yàn)證:self的引用和調(diào)用小明的引用一致
print(id(xiaoming)) # 此處結(jié)果與上一行調(diào)用時(shí)run方法結(jié)果一致# ------------------------------------------------------------
# 添加屬性 對(duì)象.屬性名 = 屬性值
# 1.類內(nèi)部添加:self.屬性名 = 屬性值,一般添加在_init_方法中
# 2.類外物添加:對(duì)象.屬性名 = 屬性值,一般不用# 獲取屬性:對(duì)象.屬性名
# 1.類內(nèi)部獲取:self.屬性名
# 2.類外部獲取:對(duì)象.屬性名,一般不使用class Cat:def eat(self):print(f'小貓{self.name}吃魚')black_cat = Cat()
black_cat.name = '黑黑' # 在外部添加屬性
black_cat.eat()# --------------------------------------------------
# 魔法方法:以兩個(gè)下劃線開頭,兩個(gè)下劃線結(jié)尾,在滿足某個(gè)條件的情況下會(huì)自動(dòng)調(diào)用class Dog:def __init__(self, n, a):self.name = nself.age = adef __str__(self):return f'今年{self.age}歲了'def show(self):print(f'小狗{self.name}')# 魔法方法在什么情況下自動(dòng)調(diào)用
# 創(chuàng)建對(duì)象后自動(dòng)調(diào)用
white_dog = Dog('巴頓', 2) # 在這一步就已經(jīng)調(diào)用了__init__
# 用在哪:給對(duì)象添加屬性(初始化方法,構(gòu)造方法).某行代碼在每次創(chuàng)建對(duì)象后都要執(zhí)行,就可以寫在__init__中
# 注意事項(xiàng):不要漏_,不要拼錯(cuò)名稱init,如果init方法出了self之外的形參,必須傳參
white = white_dog # 沒有創(chuàng)建對(duì)象,只是給對(duì)象一個(gè)別名,只有類名()形式才是創(chuàng)建對(duì)象
white.show() # 別名與原名同樣使用# ---------------------------------------------
# __str__方法:
# 什么情況下自動(dòng)調(diào)用:使用print打印對(duì)象時(shí),這個(gè)方法中一般書寫對(duì)象的屬性信息,
# 用在哪:即想要在對(duì)象打印時(shí)輸出什么內(nèi)容,就把對(duì)應(yīng)內(nèi)容寫進(jìn)這個(gè)函數(shù)默認(rèn)輸出對(duì)象的引用地址
# 注意事項(xiàng):必須返回一個(gè)字符串
print(white_dog)# -------------------------------------------
# __del__:對(duì)象被銷毀是自動(dòng)調(diào)用(處理后事)
# 使用del刪除對(duì)象,或者代碼全部運(yùn)行結(jié)束,聲明周期到,銷毀對(duì)象
# 如果對(duì)象有多個(gè)名字,即多個(gè)對(duì)象引用一個(gè)對(duì)象,需要把所有跟這個(gè)對(duì)象有關(guān)的名稱都刪除才行
class demo:def __init__(self, n):self.name = nprint('調(diào)用了init')def __del__(self):print(f"調(diào)用del,{self.name}要?jiǎng)h除")a = demo('zhangsan')
b = demo('liso')
c = demo('adfs')
cc = c
del cc # cc只是對(duì)象c的其中一個(gè)名稱,只刪除cc是不會(huì)調(diào)用__del__的,
print("此語句執(zhí)行在刪除adfs前")
del c # 與對(duì)象c有關(guān)的名稱全部被刪除,則調(diào)用__del__銷毀
print('此語句執(zhí)行在刪除adfs后')
del a # 特意聲明刪除對(duì)象a,此時(shí)調(diào)用__del__銷毀對(duì)象a
print("zhangsan銷毀后")
print("代碼結(jié)束,此句后銷毀剩余未銷毀的對(duì)象,即對(duì)象b")# ---------------------------------------------------------------------------------
class House:def __init__(self, House_type, House_area):self.House_type = House_type # 房型self.House_area = House_area # 總面積self.Last_area = House_area # 剩余面積self.item_list = [] # 家具列表def __str__(self):return f'戶型:{self.House_type}\n總面積:{self.House_area}\n剩余面積:{self.Last_area}\n家具:{self.item_list}'def add_item1(self, *args):for i in args:if self.Last_area > i.get('area'):self.item_list.append({'name': i.get('name'), 'area': i.get("area")})self.Last_area -= i.get('area')else:print('剩余面積不足')def add_item2(self, item):if self.Last_area > item.area:self.item_list.append({'name': item.name, 'area': item.area})self.Last_area -= item.areaelse:print('剩余面積不足')class Furniture:def __init__(self, name, area):self.name = nameself.area = areadef __str__(self):return f'家具:{self.name},占地面積:{self.area}'house1 = House('三室一廳', 100)
house1.add_item1({'name': '衣柜', 'area': 2}, {'name': '餐桌', 'area': 1.5})
print(house1)
bed = Furniture('席夢(mèng)思', 4)
chest = Furniture('衣柜', 2)
table = Furniture('餐桌', 1.5)
house1.add_item2(bed)
print(house1)