python進階(4):初識面向對象

来源:http://www.cnblogs.com/liluning/archive/2017/08/10/7339254.html
-Advertisement-
Play Games

一切皆對象! 預習: #仿照正方形類寫一個圓形類 class Square: def __init__(self,length_of_side): self.length_of_side = length_of_side def square(self): '面積' return self.leng ...


一切皆對象!

預習:

#仿照正方形類寫一個圓形類
class Square:
    def __init__(self,length_of_side):
        self.length_of_side = length_of_side

    def square(self):
        '面積'
        return self.length_of_side * self.length_of_side

    def perimeter(self):
        '周長'
        return self.length_of_side * 4

正方形 = Square(2)
print(正方形.square())
print(正方形.perimeter())
預習題

 

一、面向過程-->面向對象

面向過程:根據業務邏輯從上到下堆疊代碼

函數式:將某功能代碼封裝到函數中,日後便無需重覆編寫,僅調用函數即可

面向對象:對函數進行分類和封裝,讓開發“更快更好更強...”


 

二、初始類和對象

python中一切皆為對象,類型的本質就是類,所以你已經使用了很長時間的類了

在python中,用變數表示特征,用函數表示技能,因而具有相同特征和技能的一類事物就是‘類’,對象是則是這一類事物中具體的一個。

1、類

#定義一個人類 class類關鍵字和定義函數時的def同理
class Person:   
    role = 'person'  
    #role變數 屬性—— 靜態屬性
    def walk(self):  
    #self必須寫(作用後面會介紹)方法,也叫動態屬性
        print("person is walking..."

屬性引用(類名.屬性)

class Person:
    role = 'person' 
    def walk(self):
        print("person is walking...")


print(Person.role)  #查看人的role屬性
print(Person.walk)  #引用人的走路方法,註意,這裡不是在調用
引用

實例化:類名加括弧就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定製自己的特征

語法:對象名 = 類名(參數)

class Person:   #定義一個人類
    role = 'person'
    def __init__(self,name):
        self.name = name  # 每一個角色都有自己的昵稱;
 
蒼井井 = Person('蒼井井')
小澤澤 = Person('小澤澤')
#實例化的過程就是類——>對象的過程
實例化

類名()就等於在執行Person.__init__(),執行完__init__()就會返回一個對象。這個對象類似一個字典,存著屬於這個人本身的一些屬性和方法。

查看屬性&調用方法

print(蒼井井.name)     #查看對象屬性直接 對象名.屬性名

self:在實例化時自動將對象/實例本身傳給__init__的第參數,必須寫可以有別名但不建議用別名

類補充

一:我們定義的類的屬性到底存到哪裡了?有兩種方式查看
dir(類名):查出的是一個名字列表
類名.__dict__:查出的是一個字典,key為屬性名,value為屬性值

二:特殊的類屬性
類名.__name__# 類的名字(字元串)
類名.__doc__# 類的文檔字元串
類名.__base__# 類的第一個父類(在講繼承時會講)
類名.__bases__# 類所有父類構成的元組(在講繼承時會講)
類名.__dict__# 類的字典屬性
類名.__module__# 類定義所在的模塊
類名.__class__# 實例對應的類(僅新式類中)
類屬性的補充

2、對象

我們來寫一個人狗大戰:現在我們需要對我們的類做出一點點改變。人類除了可以走路之外應該具備一些攻擊技能

class Person:  # 定義一個人類
    role = 'person'  # 人的角色屬性都是人
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一個角色都有自己的昵稱;
        self.aggressivity = aggressivity  # 每一個角色都有自己的攻擊力;
        self.life_value = life_value  # 每一個角色都有自己的生命值;
    def attack(self,dog):
        # 人可以攻擊狗,這裡的狗也是一個對象。
        dog.life_value -= self.aggressivity
        print("{0}打了{1}一下,{1}剩餘血量{2}".format(self.name, dog.name, dog.life_value))
人類

對象是關於類而實際存在的一個例子,即實例。對象/實例只有一種作用:屬性引用

蒼井井 = Person('蒼井井',10,1000)
print(蒼井井.name)
print(蒼井井.aggressivity)
print(蒼井井.life_value)

你也可以引用一個方法,因為方法也是一個屬性(動態屬性)。

class 類名:
    類屬性 = None
    def __init__(self,參數1,參數2):
        self.對象的屬性1 = 參數1
        self.對象的屬性2 = 參數2

    def 方法名(self):pass

    def 方法名2(self):pass

對象名 = 類名(1,2)  #對象就是實例,代表一個具體的東西
                  #類名() : 類名+括弧就是實例化一個類,相當於調用了__init__方法
                  #括弧里傳參數,參數不需要傳self,其他與init中的形參一一對應
                  #結果返回一個對象
對象名.對象的屬性1   #查看對象的屬性,直接用 對象名.屬性名 即可
對象名.方法名()     #調用類中的方法,直接用 對象名.方法名() 即可
#對象增加屬性
對象.新的屬性名 = 1000


    
小結

對象之間的交互

既然我們要做人狗大戰,我們已經有人了,現在我們要再創建一個狗類,狗咬人,我們給狗一個bite方法。有了狗類,我們再實例化一隻實實在在的狗出來。人和狗就可以打架了。

class Dog:  # 定義一個狗類
    role = 'dog'  # 狗的角色屬性都是狗
    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一隻狗都有自己的昵稱;
        self.breed = breed  # 每一隻狗都有自己的品種;
        self.aggressivity = aggressivity  # 每一隻狗都有自己的攻擊力;
        self.life_value = life_value  # 每一隻狗都有自己的生命值;
    def bite(self,people):
        # 狗可以咬人,這裡的狗也是一個對象。
        people.life_value -= self.aggressivity
        print("{0}咬了{1}一下,{1}剩餘血量{2}".format(self.name,people.name,people.life_value))
狗類

實例化一隻狼狗:

egon = Dog('egon','狼狗',100,20000)  #創造了一隻實實在在的狗egon

交互 蒼井井 打了 egon 一下/egon 咬了 蒼井井 一下

a = Person("蒼井井",10,1000)
b = Dog("egon","狼狗",100,20000)
a.attack(b)
b.bite(a)
交互

完整的人狗大戰代碼:

class Person:  # 定義一個人類
    role = 'person'  # 人的角色屬性都是人
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一個角色都有自己的昵稱;
        self.aggressivity = aggressivity  # 每一個角色都有自己的攻擊力;
        self.life_value = life_value  # 每一個角色都有自己的生命值;
    def attack(self,dog):
        # 人可以攻擊狗,這裡的狗也是一個對象。
        dog.life_value -= self.aggressivity
        print("{0}打了{1}一下,{1}剩餘血量{2}".format(self.name, dog.name, dog.life_value))

class Dog:  # 定義一個狗類
    role = 'dog'  # 狗的角色屬性都是狗
    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一隻狗都有自己的昵稱;
        self.breed = breed  # 每一隻狗都有自己的品種;
        self.aggressivity = aggressivity  # 每一隻狗都有自己的攻擊力;
        self.life_value = life_value  # 每一隻狗都有自己的生命值;
    def bite(self,people):
        # 狗可以咬人,這裡的狗也是一個對象。
        people.life_value -= self.aggressivity
        print("{0}咬了{1}一下,{1}剩餘血量{2}".format(self.name,people.name,people.life_value))

a = Person("蒼井井",10,1000)
b = Dog("egon","狼狗",200,20000)
while True :
    a.attack(b)
    b.bite(a)
    if a.life_value <= 0 :
        print(a.name+""+b.name+"咬死了!")
        break
    if b.life_value <= 0 :
        print(b.name + "" + a.name + "咬死了!")
        break
egon大戰蒼井井

 

三、類命名空間與對象、實例的命名空間

創建一個類就會創建一個類的名稱空間,用來存儲類中定義的所有名字,這些名字稱為類的屬性

靜態屬性就是直接在類中定義的變數,動態屬性就是定義在類中的方法

其中類的數據屬性是共用給所有對象的

print(id(a.role))
print(id(Person.role))  #相同

而類的動態屬性是綁定到所有對象的

print(a.attack)
print(Person.attack)  #不同

創建一個對象/實例就會創建一個對象/實例的名稱空間,存放對象/實例的名字,稱為對象/實例的屬性,在obj.name會先從obj自己的名稱空間里找name,找不到則去類中找,類也找不到就找父類...最後都找不到就拋出異常


 

四、面向對象的組合用法

組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合

class Weapon:
    '''
        這是一個游戲里武器的數據類型
    '''
    def __init__(self,name, price, aggrev, life_value):
        self.name = name    #武器名稱
        self.price = price  #武器價格
        self.aggrev = aggrev    #武器傷害加成
        self.life_value = life_value    #武器血量加成

    def update(self, obj):  #obj就是要帶這個裝備的人
        obj.money -= self.price  # 用這個武器的人花錢買所以對應的錢要減少
        obj.aggressivity += self.aggrev  # 帶上這個裝備可以讓人增加攻擊
        obj.life_value += self.life_value  # 帶上這個裝備可以讓人增加生命值

    def prick(self, obj):  # 這是該裝備的主動技能,絞龍
        obj.life_value -= 3000  # 假設攻擊力是3000
武器類

組合交互人狗大戰完整代碼:

class Person:  # 定義一個人類
    '''
        這是一個游戲裡人物的數據類型
    '''
    role = 'person'  # 人的角色屬性都是人
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一個角色都有自己的昵稱;
        self.aggressivity = aggressivity  # 每一個角色都有自己的攻擊力;
        self.life_value = life_value  # 每一個角色都有自己的生命值;
    def attack(self,dog):
        # 人可以攻擊狗,這裡的狗也是一個對象。
        dog.life_value -= self.aggressivity
        print("{0}打了{1}一下,{1}剩餘血量{2}".format(self.name, dog.name, dog.life_value))

class Dog:  # 定義一個狗類
    '''
        這是一個游戲里狗的數據類型
    '''
    role = 'dog'  # 狗的角色屬性都是狗
    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一隻狗都有自己的昵稱;
        self.breed = breed  # 每一隻狗都有自己的品種;
        self.aggressivity = aggressivity  # 每一隻狗都有自己的攻擊力;
        self.life_value = life_value  # 每一隻狗都有自己的生命值;
    def bite(self,people):
        # 狗可以咬人,這裡的狗也是一個對象。
        people.life_value -= self.aggressivity
        print("{0}咬了{1}一下,{1}剩餘血量{2}".format(self.name,people.name,people.life_value))

class Weapon:
    '''
        這是一個游戲里武器的數據類型
    '''
    def __init__(self,name, price, aggrev, life_value):
        self.name = name    #武器名稱
        self.price = price  #武器價格
        self.aggrev = aggrev    #武器傷害加成
        self.life_value = life_value    #武器血量加成

    def update(self, obj):  #obj就是要帶這個裝備的人
        obj.money -= self.price  # 用這個武器的人花錢買所以對應的錢要減少
        obj.aggressivity += self.aggrev  # 帶上這個裝備可以讓人增加攻擊
        obj.life_value += self.life_value  # 帶上這個裝備可以讓人增加生命值

    def prick(self, obj):  # 這是該裝備的主動技能,絞龍
        obj.life_value -= 3000  # 假設攻擊力是3000
        print("{0}發動主動技:蛟龍==>{1}剩餘血量{2}".format(self.name, obj.name, obj.life_value))


a = Person("蒼井井",10,1000)
b = Dog("egon","狼狗",200,20000)
c = Weapon("蛟龍鞭",1000,40,2000)
a.money = 2000

#判斷是否買的起武器
if a.money > c.price :
    c.update(a)
    a.weapon = c

#大戰開始
while True :
    a.attack(b)
    if b.life_value <= 0 :
        print(b.name + "" + a.name + "打死了!")
        break
    a.weapon.prick(b)
    if b.life_value <= 0 :
        print(b.name + "" + a.name + "絞死了!")
        break
    b.bite(a)
    if a.life_value <= 0 :
        print(a.name+""+b.name+"咬死了!")
        break
egon大戰蒼井井升級版

 

思維導圖:

 

預習答案:

#圓形類
class Circle:
    def __init__(self,radius):
        self.radius = radius

    def area(self):
        '面積'
        return self.radius **2  * 3.14

    def perimeter(self):
        '周長'
        return self.radius * 2 *3.14= Circle(8)
print(圓.area())
print(圓.perimeter())
預習答案

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目背景 第二次世界大戰時期.. 題目描述 英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若幹名英國飛行員很好地配合。如何選擇配對飛行 ...
  • I'm changing the background color based on the data but it makes my text hard to read so I need to change the font color (to white if I have a darker ...
  • 案例1: 演示FileInputStream類的使用(用FileInputStream的對象把文件讀入到記憶體) 首先要在E盤新建一個文本文件,命名為test.txt,輸入若幹字元 運行程式,控制台輸出test.txt中輸入的字元。 案例2: 演示FileOutputStream的使用(把輸入的字元串 ...
  • 題目描述 經過千辛萬苦小 A 得到了一塊切糕,切糕的形狀是長方體,小 A 打算攔腰將切糕切成兩半分給小 B。出於美觀考慮,小 A 希望切麵能儘量光滑且和諧。於是她找到你,希望你能幫她找出最好的切割方案。 出於簡便考慮,我們將切糕視作一個長 P、寬 Q、高 R 的長方體點陣。我們將位於第 z層中第 x ...
  • 在JVM中類載入過程中,在解析階段,Java虛擬機會把類的二級制數據中的符號引用替換為直接引用。 1.符號引用(Symbolic References): 符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量,只要使用時能夠無歧義的定位到目標即可。例如,在Class文件中它以CONSTA ...
  • 題目鏈接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , and the radius is r.P and Q are two points not out ...
  • Description 高一一班的座位表是個n*m的矩陣,經過一個學期的相處,每個同學和前後左右相鄰的同學互相成為了好朋友。這學期要分文理科了,每個同學對於選擇文科與理科有著自己的喜悅值,而一對好朋友如果能同時選文科或者理科,那麼他們又將收穫一些喜悅值。作為電腦競賽教練的scp大老闆,想知道如何分 ...
  • 關於GIT GIT 是一個分散式版本控制軟體,最初由林納斯·托瓦茲(Linus Torvalds)創作,於2005年以GPL發佈。最初目的是為更好地管理Linux內核開發而設計。是目前世界上最先進的分散式版本控制系統. 什麼是版本控制 版本控制(Revision control)是維護工程藍圖的標準 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...