Day17筆記
面向對象程式設計
Object-oriented programing
對象的意義 | 對象是指現實中的物體或實體 |
面向對象的意義 | 把一切看成對象(執行個體),用各種對象之間的關系來描述事務 |
對象的特征 | 1.對象有很多屬性(名詞) 姓名,性别,年齡,… |
2.對象有很多行為(動作,動詞) 學習,吃飯,睡覺,工作,…. | |
示意 | 車(類)----àBYD e6 (京A.88888) (執行個體,對象) \ \----àBWM x5 (京B.6666) (對象) |
狗(類)---à 京巴 (戶籍号:000001) \ \----à 導盲犬 (戶籍号:000002) |
類
意義 | 1.擁有相同屬性和行為的對象分為一組,即為一個類 | |
2.類是用來描述對象的工具,用類可以建立此類的對象(執行個體) | ||
類的建立語句: Class語句 | 文法 | 作用 |
Class 類名(繼承清單) 執行個體方法定義 類變量定義 類方法定義(@classmethod) 靜态方法定義(@staticmethod) | 建立一個類 用于描述對象的行為和屬性 用于建立此類的一個或多個同類對象(執行個體) | |
說明 | 1.繼承清單可以省略,省略繼承清單表示類繼承自object 2.類名必須為辨別符 3.類名實質上是變量,他綁定一個類 | |
示例 | #定義一個簡單的類 class Dog: '''這個類用于描述一種小動物的行為和屬性''' pass dog1 = Dog() #建立一個新的Dog類的對象 print(id(dog1))#列印這個對象的id dog2 = Dog()#建立另外一個新的Dog類的對象 print(id(dog2)) #對比 lst1 = list()#建立一個空清單 print(id(lst1)) lst2 = list()#建立另外一個空清單 print(id(lst2)) |
構造函數
意義 | 構造函數調用表達式 | |
類名([建立傳參清單]) | ||
作用 | 建立這個類的執行個體對象,并傳回此執行個體對象的引用關系 | |
執行個體說明 | 1.執行個體有自己的作用域和名字空間,可以為該執行個體添加執行個體變量(也叫屬性) 2.執行個體可以調用類方法和執行個體方法 3.執行個體可以通路類變量和執行個體變量 | |
執行個體方法 | 文法 | 作用 |
Class 類名(繼承清單) Def 執行個體方法(srlf,形參1,形參2…) | 用于描述一個對象的行為,讓此類型的全部對象都擁有相同的行為 | |
說明 | 1.執行個體方法的實質是函數,是定義在類内的函數 2.執行個體方法至少有一個形參,第一個形參代表調用這個方法的執行個體,一般命名為‘self’ | |
執行個體方法的調用文法 | 1.執行個體·執行個體方法名(調用傳參) 2.類名·執行個體方法名(執行個體,調用傳參) |
示例:
class Dog:
def infos(self):
print(self.color, '的', self.kinds)
def eat(self, food):
'''
當Dog類型的對象吃東西時,用food 屬性記住
此對象吃的是什麼
'''
print(self.color, '的', self.kinds,
'正在吃', food)
self.food = food
def food_info(self):
print(self.color, '的', self.kinds,
'上次吃的是', self.food)
dog1 = Dog()
dog1.kinds = '京巴' # 為dog1綁定的Dog對象添加kinds屬性
dog1.color = '白色' # 建立color執行個體變量
dog1.color = '黃色' # 改變執行個體變量color的綁定關系
dog2 = Dog() # 另一個對象
dog2.kinds = '導盲犬'
dog2.color = '黑色'
dog1.infos()
dog2.infos()
# print(dog1.color, '的', dog1.kinds) # 擷取屬性的資料
# print(dog2.color, '的', dog2.kinds)
dog1.eat('骨頭')
dog1.food_info()
# dog2.food_info() # dog2沒有food這個屬性,調用出錯
練習:
#定義一個描述人的資訊的類:Human
# class Human:
# def set_info(self,n,a,addr = '不詳'):
# '''此方法為人添加:姓名,年齡,家庭住址屬性'''
# self.name = n
# self.age = a
# self.address = addr
# def show_info(self):
# '''此處顯示此人的資訊'''
# print(self.name,'今年',self.age,'歲 家庭住址'
# ,self.address )
# h1 = Human()
# h1.set_info('小張','20','北京市朝陽區')
# h2 = Human()
# h2.set_info('小李','18')
# h1.show_info() #小張 今年 20 歲 家庭住址:
# h2.show_info()
執行個體屬性
執行個體屬性attribute(執行個體變量) | 每個執行個體可以用自己的變量,稱為執行個體變量(也叫屬性) |
使用文法 | 執行個體·屬性名 |
屬性的指派規則: 1. 首次為屬性指派則建立此屬性 2.再次為屬性指派則改變屬性的綁定關 | |
作用 | 記錄每個對象自身的資料 |
删除屬性 | del 語句 |
文法 | del 對象·屬性名 |
示例:
class Dog:
pass
dog1 = Dog()
dog1 = color = ‘白色’ #添加屬性
del = dog.color #删除屬性
del總結
1)删除變量 | del a |
2)删除清單中的元素 | Del L[0] |
3)删除字典中鍵 | Del d[‘name’] |
4)删除對象的屬性 | Del dog1.color |
初始化方法
作用 | 對新建立的對象添加屬性等初始化操作 |
文法格式 | Class 類名(繼承清單): Def _init_(self[,形參清單]) 語句塊 注:[ ]裡的内容代表可省略 |
說明 | 1. 初始化方法名必須為_init_不可改變 2. 初始化方法會在構造函數建立執行個體後自動調用,且将執行個體自身通過第一個參數self傳入del_init_方法 3. 構造函數的實參将通過_init_方法的參數清單傳入到_init_方法中 4. 初始化方法内如果需要return語句傳回,則隻能傳回None |
示例:
# class car:
# def __init__(self,clr,brand,model):
# self.color = clr #顔色
# self.brand = brand #品牌
# self.model = model #型号
# #print('car的初始化方法被調用')
# def run(self,speed):
# print(self.color,'的',self.brand,
# self.model,'正在以',speed,
# '公裡/小時的速度行駛')
# c1 = car('紅色','奧迪','A6')
# c1.run(200)
# c2 = car('藍色','TESLAS','Model S')
# c2.run(150)
練習:
寫一個學生類,用來描述學生資訊
要求:
1)為該類添加初始化方法,實作在建立對象時自動設定'姓名','年齡','成績'屬性
2)添加set_score
方法能為對象修改成績資訊,并限制成績在0~100之間
3)添加show_info方法列印學生對象的資訊
class Student:
def __init__(self,name,age,score=0):
self.name = name
self.age = age
self.score = score
def set_score(self,score):
if 0 <= score <= 100:
self.score = score
else:
#通知調用者,調用實參不合法
raise ValueError('值不在相應的範圍内')
def show_info(self):
print(self.name,'今年',
self.age,'歲'
' 成績是',self.score)
def get_score(self):
return self.score
s1 = Student('小其',17,59)
s1.set_score(70)
s1.show_info()
print('s1綁定的對象為:',s1.get_score())
析構方法
文法 | Class 類名(繼承清單): Def __del__(self): 語句塊 |
作用 | 通常用來釋放此對象占用的資源 |
說明 | 1. 析構方法會在對象被銷毀時自動調用 2. Python語句建議不要在對象銷毀時做任何事情,因為對象銷毀的時間難以确定 |
示例:
class Car:
def __init__(self,name):
self.name = name
print("汽車",name,"對象被建立")
def __del__(self):
print("汽車",self.name,'對象被銷毀')
c1 = Car("BYD E6")
del c1
while True:
print('程式結束')
預置的執行個體屬性
文法 | __dict__屬性 __dict__屬性綁定一個存儲此執行個體自身變量的字典 |
示例
class Dog:
pass
dog1 = Dog()
print(dog1.__dict__) #{}
dog1.color = "白色"
print(dog1.__dict__) #{'color':'白色'}
__class__屬性
文法 | __class__屬性綁定建立此執行個體的類(類執行個體) |
作用 | 可以借助于此屬性來通路建立此執行個體的類 |
示例:
class Dog:
pass
dog1 = Dog()
print(dog1.__class__)
dog2 = dog1.__class__()
print(dog2.__class__)
使用者類的函數
種類 | 1.isinstance(obj, class__or__tuple) | 2.Type(obj) |
傳回這個對象obj是否是某個類的對象,或者某些類中的一個類的對象,如果是則傳回Ture,否則傳回False | 傳回對象的類 |
示例:
#在互動模式下運作
isinstance (3.14,float) #Ture
isinstance(python,str) #Ture
#在編輯器下運作
class Dog:
pass
deg1 = Dog()
isinstance(dog1,Dog) #Ture
練習:
有兩個人(Human):
1.姓名:張三 年齡:35
2.姓名:李四 年齡:8
行為:
1.教别人學東西 teacd
2.工作賺錢 work
3.借錢 borrow
用程式描述如下事情:
張三 教 李四 學 python
李四 教 張三 學 滑冰
張三 上班 賺了 1000元錢
李四 向 張三 借了 200元錢
顯示李四的全部資訊
顯示張三發全部資訊
答案:
class Human:
def __init__(self, name, age):
#1建立函數加入姓名年齡
self.name = name # 姓名
self.age = age # 年齡
self.money = 0 # 錢數
self.skill = [] # 技能
def teach(self, other, skl):
#2建立函數得到新學技能(other)代表其他人
other.skill.append(skl) # other得到了技能
print(self.name, '正在教', other.name,
'學', skl)
def work(self, money):
#3建立函數上班賺了多少錢
self.money += money
print(self.name, '上班賺了', money, '元錢')
def borrow(self, other, money):
#4建立函數本人向(other)其他人借錢
'''借錢成功傳回True,失敗傳回False'''
# 先判斷other沒有沒錢借
if other.money > money:
other.money -= money
self.money += money
print(other.name, '借給了',
self.name, money, '元錢')
return True
print(other.name, '沒借給', self.name)
return False # 借錢失敗
def show_info(self):
#5建立函數綜合起來得到新的技能,有多少錢
print(self.age, "歲的", self.name,
'有技能:', self.skill, ',錢包内的錢數是',
self.money)
zhang3 = Human("張三", 35)
li4 = Human('李四', 8)
#傳參給1
zhang3.teach(li4, 'python')#張三教李四學技能
li4.teach(zhang3, '滑冰')#李四教張三學技能
#傳參給2
zhang3.work(1000) # 張三 上班 賺了 1000元錢
#傳參給3
li4.borrow(zhang3, 200) # 李四 向 張三 借了 200元錢
#傳參給4
zhang3.show_info()
li4.show_info()
#傳參給5
練習:
将之前的學生資訊管理
原代碼中用字典來儲存每個學生資訊,現改為用對象來儲存每個學生的資訊
學生類的存入子產品student.py中