(D17)Python-面向物件程式設計
阿新 • • 發佈:2018-12-08
面向物件程式設計 Object Oriented Programming
兩種程式設計思想:
- 面向過程程式設計
- 面向過程思想:
- 最小單位:函式 function
- 面向物件程式設計:
- 最小單位:類 class
什麼是物件?
- 物件是指現實中的物體或者實體
什麼是面向物件?
- 把一切看成物件(例項) 用各種物件之間的關係描述事物
物件都有什麼特徵?
- 物件有很多屬性(名詞、形容詞)
- 物件有很多行為(動作,動詞)
什麼是類?
- 擁有相同屬性和行為的物件分為一組
- 類是用來描述物件的工具
類的建立語句:
- 語法:
- class 類名(繼承列表):
- ‘’‘ 類的文件字串’‘’
- 例項方法(類的函式mothod)定義類的變數
- 類方法(@classmethod)
- 靜態方法(@ststicmethod)
- 作用:
- 建立一個類
- 類用於描述物件屬性和行為
- 類用於建立此類的一個或者多個物件
- 說明:
- 類名必須是標示符
- 類名實質是一個變數
- class 類名(繼承列表):
示例1:
class Dog:
def eat(self,food):
print('小狗正在吃',food)
dog1 = Dog()
dog1.eat('骨頭')
例項方法(instance merhod)
-
定義格式:
- class 類名(繼承列表):
- def 示例方法名(self。引數1,引數2。。。)
- 語句塊
- def 示例方法名(self。引數1,引數2。。。)
- 作用:
- 用於描述一個物件的行為,讓此型別的全部物件都擁有相同的行為
- 說明:
- 例項方法的實質是函式,定義在內類的函式
- 例項方法至少有一個形參,第一個形參代表呼叫這個方法的例項,一般命名為’self’
例項方法的呼叫語法:
例項.例項方法名(呼叫傳參):
或
類名.例項方法名(例項,呼叫傳參) - class 類名(繼承列表):
示例2:
class Dog:
def eat(self,food):
print('小狗正在吃',food)
def sleep(self,hour):
print('吃完了要睡',hour,'小時')
dog1 = Dog()
dog1.eat('骨頭')
dog1.sleep('3')
dog2 = Dog()
dog2.sleep('5')
例項屬性:(attribute 例項變數)
- 每個例項都可以用自己的變數來記錄每個物件自己的資料,把這個變數稱為例項變數
- 使用語法:
- 例項.屬性名
- 賦值規則:
- 首次屬性賦值擇建立此屬性
- 再次賦值擇改變此屬性的繫結關係
- 作用:
- 記錄每個物件自身的資料
示例3:
class human:
def set_info(self,name,age,address='不詳'):
self.name = name
self.age = age
self.address =address
def show_info(self):
print(self.name,'今年',self.age,'歲','家住',self.address)
s1 = human()
s1.set_info('小張',20,'北京市東城區')
s2 = human()
s2.set_info('小李','18')
s1.show_info()
s2.show_info()
刪除屬性:
- del 物件.例項變數名
del語句總結:
- 1)刪除變數
- 2)刪除列表中的元素
- 3)刪除字典中的鍵
- 4)刪除屬性
初始化方法
- 作用:
- 物件建立的物件新增屬性
- 語法格式:
- class 類名
- def__init__(self[,形參列表])
- 語句塊
- def__init__(self[,形參列表])
- 說明:
- 初始化方法得名必須是‘init’不可改變
- 初始化方法會在建構函式 建立例項後自動呼叫且將例項自身通過飛一個引數self傳入‘init’方法
- 建構函式的實參將通過__init__方法的引數列表傳入到init方法中
- 初始化方法內如果需要return語句返回擇只能返回none
- class 類名
示例4:
class student:
def __init__(self,name,age,sorce=0):
self.name = name
self.age = age
self.sorce = sorce
def set_sorce(self,sorce):
if 0 <= sorce <= 100:
self.sorce = sorce
else:
print('不在範圍內')
def show_info(self):
print(self.name,'今年',self.age,'歲','成績',self.sorce)
L = []
L.append(student('小張',20,100))
L.append(student('小李',18,95))
L.append(student('小錢',20))
L[-1].set_sorce(70)
for s in L:
s.show_info()
析構方法:
- 格式:
- class 類名(繼承列表)
- def del(self):
- 。。。
- def del(self):
- class 類名(繼承列表)
- 作用:
- 在此物件銷燬前釋放次物件佔用的資源
- 說明:
- 析構方法會在物件銷燬時自動呼叫
- python 語句建議不要在物件銷燬時做任何事情,因為銷燬時間難以確定
示例5:
class Car:
def __init__(self, name):
self.name = name
print("汽車", name, '物件被建立')
def __del__(self):
print("汽車", self.name, '物件被銷燬')
c1 = Car("BYD E6")
# del c1
# L = []
預置的例項屬性
dict 屬性
- __dict__屬性繫結一個儲存此例項自身變數的字典
示例6:
class Dog:
pass
dog1 = Dog()
print(dog1.__dict__) # {}
dog1.color = "白色"
print(dog1.__dict__) # {'color':'白色'}
__class__屬性
- __class__屬性繫結建立此例項的類
- 作用:
- 可以藉助此屬性來訪問建立此例項的類
示例7:
class Dog:
pass
dog1 = Dog()
print(dog1.__class__)
dog2 = dog1.__class__()
print(dog2.__class__)
用於類的函式:
- isinstance (obj,class_or_tuple)
- 返回這個物件obj是否是類的物件,或者某些類中的一個類物件
- 如果是則返回True,否則返回Flase
- type(obj) 返回物件的類
綜合練習
有兩個人:
1. 姓名:張三
年齡:35歲
2. 姓名:李四
年齡:8歲
行為:
1.教別人學東西 teach
2.工作賺錢 work
3.借錢 borrow
用程式描述如下事情:
張三 教 李四 學 python
李四 教 張三 學 滑冰
張三 上班 賺了 1000元錢
李四 向 張三 借了 200元錢
顯示李四的全部資訊
顯示張三的全部資訊
程式碼:
class Human:
def __init__(self, name, age):
self.name = name # 姓名
self.age = age # 年齡
self.money = 0 # 錢數
self.skill = [] # 技能
def teach(self, other, skl):
other.skill.append(skl) # other得到了技能
print(self.name, '正在教', other.name,
'學', skl)
def work(self, money):
self.money += money
print(self.name, '上班賺了', money, '元錢')
def borrow(self, other, money):
'''借錢成功返回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):
print(self.age, "歲的", self.name,
'有技能:', self.skill, ',錢包內的錢數是',
self.money)
zhang3 = Human("張三", 35)
li4 = Human('李四', 8)
zhang3.teach(li4, 'python')
li4.teach(zhang3, '滑冰')
zhang3.work(1000) # 張三 上班 賺了 1000元錢
li4.borrow(zhang3, 200) # 李四 向 張三 借了 200元錢
zhang3.show_info()
li4.show_info()