1. 程式人生 > >五、面向物件基礎

五、面向物件基礎

一、面向物件與面向過程

​ 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)   # 普通攻擊