五、面向物件基礎
一、面向物件與面向過程
1.面向過程: 優點:複雜問題流程化,簡單化。
缺點:可擴充套件性差。
1.面向過程: 優點:可擴充套件性強
缺點:程式設計的複雜程度要高於面向過程
二、類和物件
物件:屬性和方法的結合體
類: 一系列共同的屬性和方法
顯示生活中:先有物件再有類
程式中:先有類再有物件
定義類:
class OldboyStudent:
# 變量表示屬性
school = 'oldboy'
def choose(self):
print('is choosing course')
class OldboyStudent:
class關鍵字 + 類名:
print(OldboyStudent.__dict__)
用__dict__檢視類的屬性和函式(方法),以字典的形式列印
print(OldboyStudent.__dict__)
print(OldboyStudent.__dict__['school'])
print(OldboyStudent.__dict__['choose'])
類來呼叫方法,需要傳值給第一個引數:
OldboyStudent.choose(123)
print(OldboyStudent.choose_course)
用類名點出函式,如果不加括號就是列印函式的記憶體地址。
如何生成物件?
類+括號—>生成物件
stu1 = OldboyStudent()
物件獲取屬性和方法 通過 點 . 來獲取
print(stu1.school)
print(stu1.choose)
檢視物件中的屬性和函式
print(stu1.__dict__)
物件來呼叫方法,第一個引數不用傳
stu1.choose()
物件自己獨有的屬性和方法:
stu1.name = "cxk sb"
print(stu1.__dict__)
屬性的查詢順序:
先從物件自身找--->再到類中去找----->沒有就報錯
stu1.school = 'xxx'
print(stu1.xx)
向物件中放屬性:
第一種方法:
stu1 = Student()
stu1.name = 'cxk sb'
第二種方法:
class Student:
#變量表示屬性
school='oldboy'
#__init__ 看好名字,不是__int__
def __init__(self,name):
self.name=name
def choose(self):
print("選課....")
def study(self):
print('學習')
產生物件:
stu1 = Student()
stu1 = Student('cxk')
當我們在例項化產生物件的時候, __init__
在產生物件時會自動執行執行這個函式,完成物件的初始化
stu2 = Student()
stu2 = Student('pike')
三、繫結方法
定義在類內部的方法:
如果類來呼叫:就是一個普通函式,有幾個引數就需要傳幾個引數
如果物件來呼叫:它叫物件的繫結方法,第一個引數不需要傳,自動傳遞
class Student:
#變量表示屬性
school='oldboy'
#__init__ 看好名字,不是__int__
def __init__(self,name):
self.name=name
def choose(self):
print("選課....")
def study(self):
print('%s學會了python'%self.name)
stu1=Student('cxk')
stu1.study()
stu1=Student('李鐵蛋')
stu1.study()
四、一切皆物件
在python中,字典、列表字元....都是物件
類即型別
l1 = [1,2,3]
類例項化產生物件
l1 = list([1,2,3])
l2 = list([5,6,7])
物件呼叫物件的繫結方法,修改物件自己
l1.append(5)
print(l1)
list.append(l1,9)
print(l1)
五、面向物件基礎練習——設計一個對戰遊戲:
1.有英雄類,各個英雄都有自己方法和屬性:名字、攻擊力、生命值、金錢等,需要用到就新增
例如拿英雄聯盟的兩個英雄 銳雯和蓋倫 做例子
class Riwen: # 定義銳雯類
def __init__(self,name,aggressivity=66,hp=520,money=618): # 預設屬性
self.name = name
self.aggressivity = aggressivity
self.hp = hp
self.money = money
def attack(self,target): # 攻擊方法
target.hp -= self.aggressivity
print(f'{self.name}攻擊了{target.name},{target.name}的生命剩餘{target.hp}')
class Garen: # 定義蓋倫類
def __init__(self,name,aggressivity=55,hp=560,money=666): # 預設屬性
self.name = name
self.aggressivity = aggressivity
self.hp = hp
self.money = money
def attack(self,target): #攻擊方法
target.hp -= self.aggressivity
print(f'{self.name}攻擊了{target.name},{target.name}的生命剩餘{target.hp}')
class Dagger: # 定義裝備類
def __init__(self,aggressivity=10,price=500,hp=100): # 裝備屬性
self.aggressivity = aggressivity
self.price = price
self.hp = hp
def update(self,target): # 裝備方法
target.money -= self.price # 減錢
target.aggressivity += self.aggressivity # 加攻擊力
target.hp += self.hp # 加生命值
def fire(self,target): # 裝備的主動技能
target.hp -= 100 # 假設裝備的攻擊力為100
# 對戰互動
r1 = Riwen('蔡徐坤')
r2 = Garen('耐克')
m1 = Dagger()
print(r1.hp,r1.aggressivity,r1.money)
if r1.money > m1.price:
r1.m1 = m1
m1.update(r1)
print(r1.hp,r1.aggressivity,r1.money)
r1.attack(r2) # 普通攻擊
r1.m1.fire(r2) # 裝備攻擊
print(r2.hp)
r2.attack(r1) # 普通攻擊