1. 程式人生 > >類與物件,面向物件與面向過程的對比,面向物件的三大特徵

類與物件,面向物件與面向過程的對比,面向物件的三大特徵

類: 就是圖紙. 建立物件的第一步. 先畫圖紙. 先寫類.
物件: 物件就是車. 通過圖紙造出來的具體的東西. 通過類來建立物件

類與物件的關係:
類是對xxx事物的歸類.
寫:
__init__(self, 引數) 引數一般作為屬性設定給物件. 物件就是self,
對屬性的封裝.

def 方法(self, 引數): 方法. 第一個引數一般是固定的self. 當前類的物件.
pass

物件是xx型別的一個具體
建立物件: 類名()

建立類:
class 類名:

def __init__(self): # 初始化方法. 又被成為構造方法
self.屬性 = 值
self.屬性 = 值
self.屬性 = 值

def fangfa(self):
方法體(函式體, return)

建立物件:
變數 = 類名() # 例項化 <-> 建立物件

變數.屬性 # 訪問物件的屬性資訊
變數.方法() # 訪問類中的方法
# class Car:      #類名首字母大寫.
#     pass
#
# # 造車
# c = Car()
# # 出場之後進行改裝
# c.color = "red"     # 物件.屬性   點:的
# c.pai = "京A88888"   # 物件.屬性
# c.pailiang = "555L"   # 排量
#
# print(c.color)
# print(c.pai)
# print(c.pailiang)


# c.color = "green"  # 當屬性存在的時候是修改屬性資訊
# 物件.屬性 = xxxx 設定屬性資訊

# class Car:
#     # __init__ 方法是一個特殊的方法,初始化方法(構造方法)
#     # 在建立物件的時候會自動的呼叫__init__()
#     # self 就是你創建出來的那個物件
#
#     def __init__(self, color, pai, pailiang):   # init初始化方法,在建立物件的時候預設執行這個函式
#         self.color = color
#         self.pai = pai
#         self.pailiang = pailiang
#
#     # 跑:動作,功能 -> 函式
#     # 在類中寫的函式 -> 方法
#     # self 當前類的物件
#
#     def pao(self):      # self是自動傳遞的,不用管它
#         print("%s我的車能跑" % self.color)   # self.color
#
#     def jump(self):
#         print("%s牛砸能蹦高" % self.color)
#
#
#
#
# c = Car("紅色", '京A88888', '555L')
# c2 = Car('藍色', '京B66666', '1.6T')
# print(c.color)
# print(c2.color)
#
# c.pao()
# c2.pao()
# c.jump()
# c2.jump()

  面向物件與面向過程的對比

# 大象裝冰箱
# 指令碼  此時程式碼最簡單,不需要構思整個程式的概況
# print("開門")
# print("裝大象")
# print("關門")

# 函數語言程式設計,比指令碼麻煩,對功能有了概況
# def kai():
#     print('開門')
# def zhuang():
#     print("裝大象")
# def guan():
#     print('關門')
#
# kai()
# zhuang()
# guan()

# 面向物件程式設計,對整個系統進行分析,分析出需要哪些物件然後給物件進行歸類.
# 先寫類,然後使用類建立物件,最後用物件去執行相關的操作
# class Elephant:
#     def __init__(self):
#         print("建立了一個大象")
#
#     def kai(self):
#         print("開門")
#
#     def zuan(self):
#         print("大象進冰箱")
#
#     def guan(self):
#         print("大象把門帶上")
#
# dx = Elephant()
# dx.kai()
# dx.zuan()
# dx.guan()

# 第一回合
# 指令碼勝
# 函式側重的是功能
# 面向物件側重的是 歸類

# PK2
# 小豬佩奇. 使用嘴巴嘟嘟技能攻擊 超人
# 小豬佩奇. 使用嘴巴嘟嘟技能攻擊 蝙蝠俠
# 小豬佩奇. 使用嘴巴嘟嘟技能攻擊 蜘蛛俠
#
# # 面向過程: 程式碼非常的冗餘. 尤其是引數
# def fight_superman(name, jineng):
#     print("%s使用%s攻擊超人" % (name, jineng))
#
# def fight_batman(name, jineng):
#     print("%s使用%s攻擊蝙蝠俠" % (name, jineng))
#
# def fight_spiderman(name, jineng):
#     print("%s使用%s攻擊蜘蛛俠" % (name, jineng))
#
#
# fight_superman('小豬佩奇', "嘴巴嘟嘟")
# fight_batman('小豬佩奇', "嘴巴嘟嘟")
# fight_spiderman('小豬佩奇', "嘴巴嘟嘟")
#
#
# class Pig:
#     def __init__(self, name, jineng):
#         self.name = name
#         self.jineng = jineng
#
#     def fight_superman(self):
#         print("%s使用%s攻擊超人" % (self.name, self.jineng))
#
#     def fight_batman(self):
#         print("%s使用%s攻擊蝙蝠俠" % (self.name, self.jineng))
#
#     def fight_spiderman(self):
#         print("%s使用%s攻擊蜘蛛俠" % (self.name, self.jineng))
#
#
# pg = Pig("小豬佩奇", "嘴巴嘟嘟")
# 不需要向原來一樣傳遞一樣的引數了
# 面向物件的程式: 結果相對清晰. 缺點: 程式碼量比原來大, 上手太難
# pg.fight_batman()
# pg.fight_spiderman()
# pg.fight_superman()



# 如果寫一個定時任務, 半夜12點. 給老闆傳送財務報表(一張圖)
# def send_email(address, name, title, content):
#     print("傳送郵件")
#
# def send_wechat(wechat_num, name, title, content):
#     print("傳送微信")
#
# def send_chat(phone_num, name, title, content):
#     print("傳送簡訊")
#
# def send_dd(dd_num, name, title, content):
#     print("傳送釘釘")
#
# def send_oa(oa_num, name, title, content):
#     print("傳送OA")


# class Messager:
#     def __init__(self, name, title, content):
#         self.name = name
#         self.title = title
#         self.content = content
#
#     def send_email(self, address):
#         print("傳送郵件")
#
#     def send_wechat(self, wechat_num):
#         print("傳送微信")
#
#     def send_chat(self, phone_num):
#         print("傳送簡訊")
#
#     def send_dd(self, dd_num):
#         print("傳送釘釘")
#
#     def send_oa(self, oa_num):
#         print("傳送OA")


# 用面向物件就比面向過程稍微好一些.
#   可維護性比原來好

# python同時支援面向物件和麵向過程:
# 面向過程: 應用程式相對比較小. 不需要大規模的設計
# 面向物件: 程式非常大. 專案管理 維護成本很高. 此時更適合用面向物件(結構)

# java : 純面向物件  => 可以把一個微型專案. 做成巨型專案

  面向物件的三大特徵

  封裝:
            1. 對屬性的封裝(__init__())
                self.xxx = xxx
            2. 對方法和功能的封裝

        繼承
            子類自動擁有父類中除了私有內容外的其他所有內容
            class Bar(Foo):  Bar對Foo進行了擴充套件
                pass

            當出現x是一種y的時候. 推薦使用繼承關係
            python支援多繼承. 查詢順序: 先找離他近的.

        多型(python原生直接就是多型)
            python更多的支援的是鴨子模型, 只要會嘎嘎叫就是好鴨子