1. 程式人生 > >關於python的面向物件

關於python的面向物件

一,面向物件

1..面向物件的過程:一切以事物的流程為核心,核心是過程二字,過程是指解決問題的步驟,

是一種機械是的程式設計思維

優點:負責的問題流程化,編寫相對簡單 缺點:可擴充套件效能差

2.面向物件一切以物件為中心

優點:可擴充套件性強  缺點:程式設計複雜度高於面向過程

面向物件的編寫

class Car:
     pass
c=Car()
c.lunzi="圓的"
c.red='騷紅色'
c.pailiang="6.31"
c.pai="粵b無數"
c.price="200000"
print(c.price)

b=Car()
b.yanse="綠色"
b.year="10年"
b.price="100萬"
b.paizi="寶馬"
b.排量="5.42"
print(b.排量)

 

class Computer:

    # 構造方法. 在建立的物件的時候由系統自動訪問這個方法
    # self: 自己. 自身. 類的物件. 當前正在建立的物件
    def __init__(self, pinpai, price, cpu, neicun): # 誰在呼叫, self就是誰, self 由python自動傳遞
        self.pinpai = pinpai
        self.price = price
        self.cpu = cpu
        self.neicun = neicun

    # 方法. 該型別的物件能夠執行哪些操作
    def dayouxi(self, game): # 誰呼叫的這個方法. self就是誰
        # 我用我的self.pinpai的呼叫. 利用很牛B的self.cpu來完成吃雞操作
        print("我要打遊戲, 我要%s" % game)

c = Computer("微軟",25000,"i9","5T") # 建立物件
c.dayouxi("吃雞")


c2 = Computer("mac book", 22000, "i7", "16G")
print(c2.price)

c.pinpai = "神州"
c.price = 100
c.cpu = "賽揚雙核"
c.neicun = "1G"

c2 = Computer()
c2.pinpai = "小米"
c2.price = 10000
c2.cpu = "I7-8750"
c2.neicun = "1T"

print(c2.pinpai) # 小米
print(c.pinpai) # 神州

  

思考過程:
準備建立類 -> 定義__init__()  self.xxx = xxxx
物件能幹什麼事兒?  方法. def 方法名(self, 引數...)

練習題:
 1. 建立⼀個武松. 武松可以打老虎, 殺嫂⼦, 替天⾏道
class HaoHan:
    def __init__(self, waihao, name, wuqi, jineng):
        self.waihao = waihao
        self.name = name
        self.wuqi = wuqi
        self.jineng = jineng

    def dalaohu(self):
        pass

    def shasaozi(self):
        pass

    def titianxingdao(self):
        pass

ws = HaoHan("行者", "武松", "拳頭", "王八拳")
ws.dalaohu()
ws.shasaozi()
ws.titianxingdao()

lk = HaoHan("黑旋風", "李逵", "雙板斧", "旋風斬")
lk.dalaohu()
lk.shasaozi()
lk.titianxingdao()


 2. ⽤⾯向物件的思維來模擬LOL⾥的蓋倫(英雄)上陣殺敵.
class Tank:
    def __init__(self, name, waihao, hp, fy):
        self.name = name
        self.waihao = waihao
        self.hp = hp
        self.fy = fy

    def kang(self):
        pass

    def zhengyishenpan(self):
        pass

gailun = Tank("蓋倫","德瑪西亞之力", 5000, 200)

 3. 編寫和尚類. ⾃⼰⾃由發揮和尚有哪些屬性和⽅法.
class HeShang:
    def __init__(self, fahao, simiao):
        self.fahao = fahao
        self.simiao = simiao

    def nianjing(self):
        pass

    def marray(self):
        pass
#  4. ⽤⾯向物件的思維來完成⽤戶登入.
class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def login(self, uname, upws):
        if uname == self.username and upws == self.password:
            return True
        else:
            return False
u1 = User("alex", "123")
ret = u1.login(input("請輸入你的使用者名稱"), input("請輸入密碼"))
print(ret)
主語發生了改變
函數語言程式設計. 簡單的基本功能還是函數語言程式設計更加好用
面向物件: 如果功能非常複雜的時候.
例一:要把大象裝冰箱:面向物件的過程
def open():
    print("開門")
def zhuang():
    print("裝大象")
def close():
    print("關門")

open()
zhuang()
close()
例二:面向物件:
class DaXiang:
    def open(self):
        print("開門")
    def jinbingxiang(self):
        print('進冰箱')
    def guanmen(self):
        print("關門")

dx = DaXiang()
dx.open()
dx.jinbingxiang()
dx.guanmen()

  

面向物件過程
#  alex大戰奧特曼
def daZhanAoTeMan(name, wuqi, jineng):
    print("%s 使用 %s 配合 %s技能狂懟奧特曼" % (name, wuqi, jineng))
# alex大戰哥斯拉
def daZhanGeSiLa(name, wuqi, jineng):
    print("%s 使用 %s 配合 %s技能狂懟哥斯拉" % (name, wuqi, jineng))
# alex大戰蝙蝠俠
def daZhanBianFuXia(name, wuqi, jineng):
    print("%s 使用 %s 配合 %s技能狂懟蝙蝠俠" % (name, wuqi, jineng))

daZhanAoTeMan("alex", "菜刀", "動感光波")
daZhanGeSiLa("alex", "菜刀", "動感光波")
daZhanBianFuXia("alex", "菜刀", "動感光波")
面向物件:物件做主語執行動作
class Person:
    def __init__(self, name, wuqi, jineng, taopaoluxian):
        # 封裝: 對屬性的封裝.
        self.name = name
        self.wuqi = wuqi
        self.jineng = jineng
        self.taopaoluxian = taopaoluxian


    # 對方法進行封裝
    def daZhanAoTeMan(self):
        print("%s 使用 %s 配合 %s技能狂懟奧特曼" % (self.name, self.wuqi, self.jineng))

    # alex大戰哥斯拉
    def daZhanGeSiLa(self):
        print("%s 使用 %s 配合 %s技能狂懟哥斯拉" % (self.name, self.wuqi, self.jineng))

    # alex大戰蝙蝠俠
    def daZhanBianFuXia(self):
        print("%s 使用 %s 配合 %s技能狂懟蝙蝠俠" % (self.name, self.wuqi, self.jineng))

a1 = Person("alex", "菜刀", "動感光波", "打車跑")
a1.daZhanAoTeMan()
a1.daZhanBianFuXia()
a1.daZhanGeSiLa()
繼承: 子類自動擁有父類中除了私有內容外的其他所有的屬性:
例一
class Niu:
    def da(self):
        print("牛魔王打架很厲害")

class HongHaiEer(Niu):
    def da(self):
        print("噴火")

hhl = HongHaiEer()
hhl.da()
例二

多肽:同一物件擁有多種形態

同一個物件. 擁有多種形態 java c++
class Aniaml:
    def dong(self):
        print("動物可以動")


class Cat(Aniaml):
    def chi(self):
        print("貓喜歡吃魚")

a = Cat()
a.chi() # 站在貓的角度. 可以吃
a.dong() # 站在動物的角度可以動

# 在python中多型的效果感受不夠明確
class YaoGuai:
    def teng(self):
        print("妖怪一定會疼")

class ZhiZhuJing(YaoGuai):
    def teng(self):
        print("蜘蛛精很痛")

class HeiXiongJing(YaoGuai):
    def teng(self):
        print("黑熊精也很疼")

class BaiGuJing(YaoGuai):
    def teng(self):
        print("白骨精骨頭很疼")

class JinJiaoDaWang(YaoGuai):
    def fangundeteng(self):
        print("爆炸的疼")

class SunWuKong:
    def da(self, yg):
        yg.teng() #  只要包含了xxx功能的內容都可以試用. 鴨子模型  ->  多型性
# 西遊記開始
swk = SunWuKong()
hxj = HeiXiongJing()
swk.da(hxj)
bgj = BaiGuJing()
swk.da(bgj)
zzj = ZhiZhuJing()
swk.da(zzj)
alex = JinJiaoDaWang()
swk.da(alex)

多繼承:就近原則:

class Foo1:
    def money(self):
        print("有錢")

class Foo2:
    def play(self):
        print("玩兒")

    def money(self):
        print("沒錢")

class Bar(Foo2, Foo1): # MRO c3演算法
    pass

b = Bar()
b.money()