Python_面向對象初步_類_屬性_方法_綜合案例(10)

目錄:

一、面向對象介紹
二、類和對象
三、實例屬性和方法
四、構造方法
五、對象的打印和開發
六、案例練習說明

創作不易,各位看官,點個贊收藏、關注必回關、QAQ、您的點贊是我更新的最大動力!


一、面向對象介紹

(一)什麼是面向對象

面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)的主要思想是 把構成問題的各個事物分解成各個對象,建立對象的目的不是爲了完成一個步驟,而是爲了 描敘一個事物在整個解決問題的步驟中的行爲

(二)面向過程和麪向對象

面向過程和麪向對象都是軟件開發行業中的編程思想,在軟件開發歷程中都扮演了非常 重要的角色,面向過程編程思想最直觀的實現方式就是函數式編程,面向對象的最直觀的實 現方式是類和對象
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使 用的時候一個一個依次調用就可以解決問題。面向對象是把構成問題的事物分解成各個對象, 通過對象的行爲之間的互相關聯解決問題,同時抽取的對象本身都是獨立的,可以擴展出更 多的實現。面向過程和麪向對象最直觀的理解如下圖所示:

在這裏插入圖片描述
(三)面向對象的優勢

面向對象和麪向過程不同的是,將構成問題的各個事物抽象出來作爲單獨的對象,此時 每個對象的行爲就不再侷限於解決固定問題的某個步驟了,而是可以讓對象的行爲適用於任 何一個可以起到作用的地方,這樣做的結果就是軟件的功能得到了非常好的擴展

返回文章目錄

二、類和對象

(一)術語解釋

  • 面向對象程序設計(Object Oriented Programming)中的概念主要包括:對象、類、屬性、 方法、封裝、繼承、多態、消息傳遞。通過這些概念面向對象的思想得到了具體的體現

1、對象(object)
生活中有一句話,萬物皆對象,對象就是生活中客觀存在的實際物體,也被稱爲實體,實體
對象,實例,實例對象。
2、類(class)
類其實就是類型的簡稱,描述的是不同的數據類型,生活中還是那句話:萬物皆對象,各種
事物分門別類,描述生活中的不同類型的事物,就是類
3、屬性(Attribute)
生活中的實體物體,都是包含自己的特徵的,如人包含姓名、性別、年齡、膚色特徵(名詞),
電腦包含顏色、尺寸、CPU、內存特徵,課程包含名稱,時長,週期特徵。
屬性就是對象的特徵(名詞)。
4、方法(Method)
生活中的實體物體,都是包含具體的行爲的,如人包含喫飯睡覺打豆豆…行爲,電腦包含開 機、關機、播放、遊戲、辦公行爲,課程包含信息傳播行爲。
方法就是對象的行爲(動詞)。
5、其它(other)
面向對象中還會涉及到封裝、繼承、多態、數據綁定、消息通信等等,具體的概念和應 用都會在後續的章節中進行詳細解讀

(二)類型聲明

類和對象是計算機編程語言中的用於描述事物的載體。它們的關係是,對象是類的實例, 類是對象的模板。如下圖所示:
在這裏插入圖片描述
(三)類型聲明

類型聲明是面向對象程序設計開發的第一個環節,本節內容通過基本語法、命名規範先 瞭解類型的基本建模方式,再分析在項目案例中怎麼分析和構建符合需求的類型

1、基本語法
Python 編程語言的語法提供了 class 關鍵字,用於類型的聲明,基本語法如下:
在這裏插入圖片描述
2、聲明規範
Python 編程語言相比較其他編程語言,爲了簡化編碼制定了更加嚴格的語法規則,並 且在軟件開發過程中通過開發規範進行約束

① 類型名稱:標識符(字母、數字、下劃線組成,數字不能開頭)
帕斯卡命名法(大駝峯命名法):一個或者多個單詞組成,每個單詞首字母大寫
② 屬性特徵:就是一個變量,必須和 self 一起使用;
遵循變量的命名規則[見名知意、下劃線命名法]
③ 方法行爲:就是一個函數,遵循函數的命名規則[見名知意、下劃線命名法]


  • 類型命名規範
    類型名稱是一種標識符,由英文字母、數字和下劃線組成,數字不能開頭。項目開發規 範要求類型名稱要做到見名知意,使用帕斯卡命名法
帕斯卡命名法,某些資料中也稱爲大駝峯命名法,是由一個或者多個單詞組成,每個大 單詞的首字母大寫,如:UserInformation、Consumer,Goods 等等
  • 屬性名稱規範
    屬性,本質上就是一個普通的變量,聲明在類型中用於描述類型的一個特徵數據,所以 屬性名稱的規範和變量的命名規範一致,做到見名知意,優先推薦下劃線命名法,或者使用 駝峯命名法
駝峯命名法,某些資料中也稱爲小駝峯命名法,是由一個或者多個單詞組成,第一個單 詞全部小寫,後面每個大單詞的首字母大寫,如:userGender、userType 等等
  • 方法名稱規範
方法,本質上就是在類型中聲明的函數(類型賦予了方法更多的功能),所以方法名稱的 命名規範和函數的命名規範一致,做到見名知意,優先推薦下劃線命名法,或者使用駝峯命 名法
  • 其它規範
類型在標準開發規範的約束下,要求在類型聲明內部第一行必須包含文檔註釋,描述類 型的作用,在類型內部先聲明屬性,再聲明方法,不同的方法之間分隔一個空行
  • 類型的聲明案例
下面的代碼中,聲明瞭一個普通的用戶類型,類型包含賬號、密碼、暱稱屬性,包含保 存、刪除的方法
class User:
    """用戶類型"""
    def __init__(self,username,password,nickname):
        """記錄用戶屬性"""
        print("開始執行對象初始化")
        self.username = username
        self.password = password
        self.nickname = nickname

    def save(self):
        """保存方法"""
        pass

    def delete(self):
        """刪除方法"""
        print("執行刪除操作")

(四)面向對象設計開發

面向對象程序設計開發,是一種成熟的程序設計開發方式,有固定的開發步驟,通常包 含如下四個環節:

面向對象分析(OOA:Object-Oriented Analysis) 從用戶需求出發,分析項目中需要解決的問題,抽象項目中的功能和互相依賴 的關係,確定功能開發過程中的限制條件
面向對象設計(OOD:Object-Oriented Design) 根據分析得到的具體的問題,抽取參與解決問題的對象
面向對象編程(OOP:Object-Oriented Programming)
編程對象測試(OOT:Object-Oriented Testing)

軟件從開發到交付的完整示意流程,如下圖所示:
在這裏插入圖片描述
1、項目分析
以個人博客項目爲例進行面向對象的分析及開發,個人博客是以信息共享和社交 爲目的經典軟件產品,首先針對個人博客的功能進行分解,如圖所示:
在這裏插入圖片描述
項目中需要的功能,就是我們需要解決的問題,根據面向對象的設計原則,簡要分析實 現上述功能需要參與的對象,如圖所示:
在這裏插入圖片描述
2、聲明類型
根據項目分析,我們需要創建項目中需要的類型,首先創建項目並構建項目結構,項目 名稱爲:blog,項目中定義類型的模塊爲:model.py,初始項目結構如下圖所示:
在這裏插入圖片描述

返回文章目錄

三、實例屬性和方法

類型作爲一種事物的描述,需要同時描述事物的特徵和他們所具備的行爲,描述特徵數 據的就是實例屬性,描述行爲的就是實例方法,如下圖所示超級英雄類型中,就可以抽取所 有超級英雄共有的特徵和行爲,並將這些特徵和行爲聲明在超級英雄類型中表現出來

(一)基本語法

實例屬性,是類型中用於描述每個對象具體數據的,在類型聲明過程中,將實例屬性聲 明在__init__()方法中,通過接受傳遞的參數數據進行數據初始化,基本語法如下:

class User:
    """用戶類型"""
    def __init__(self,username,password,nickname):
        """記錄用戶屬性"""
        print("開始執行對象初始化")
        self.username = username
        self.password = password
        self.nickname = nickname

實例方法,是類型中描述每個對象的行爲操作的,通過函數語法進行體現,將對象的行 爲函數聲明在類型的內部,稱爲類型的實例方法,基本語法如下:

class User:
    """用戶類型"""
    def __init__(self,username,password,nickname):
        """記錄用戶屬性"""
        print("開始執行對象初始化")
        self.username = username
        self.password = password
        self.nickname = nickname

    def save(self):
        """保存方法"""
        pass

    def delete(self):
        """刪除方法"""
        print("執行刪除操作")

(二)self關鍵字

類型中的方法,第一個參數都是 self,self 關鍵字用於描述當前對象自身,類似生活中” 我”這個名詞一樣,通過 self 可以在實例方法中獲取到當前對象自身的所有實例屬性和實例 方法
在這裏插入圖片描述

self 關鍵字主要用於描述當前對象,聲明在方法的第一個位置參數上,是一個變量,所以可 以修改成任意單詞來表示,但是約定俗稱使用 self 這個單詞

(三)實例操作

個人博客項目中,我們已經根據功能涉及的對象抽取了作者類型和文章類型,根據我們 在項目中的操作方式,就可以爲所有的作者聲明他們共有的屬性和方法了,文章亦如此
在這裏插入圖片描述
根據分析得到的結果,按照類型聲明的語法,完善作者類型的實例屬性和實例方法,操 作代碼如下:

在這裏插入圖片描述
返回文章目錄

四、構造方法

面向對象程序設計開發中,對象是具體包含處理數據的實體,通過類型創建對象並使用 對象的實例屬性和實例方法,是開發必須掌握的一個環節

(一)創建對象語法

通過聲明的類型,可以創建該類型對應的具體對象,基本語法如下:
在這裏插入圖片描述
創建對象時就可以將數據通過參數傳遞給__init__()方法完成屬性的初始化,並 將創建好的對象的地址存儲在 user 變量中,通過 user 變量可以找到或者引用到創建的對象, 所以稱 user 變量爲對象的引用變量

(二)對象屬性和方法

創建對象是爲了使用對象的屬性和方法,在語法中可以通過對象的引用變量來獲取對象 並操作對象的屬性和方法
1、對象的實例屬性

在這裏插入圖片描述

2、對象的實例方法

在這裏插入圖片描述

(三)、對象的創建過程

程序都是運行在計算機內存中的,對象的創建也是在程序申請的內存空間中完成的,在 對象構建過程中,主要經歷了申請空間、創建對象、屬性初始化的過程
運行程序,就可以看到在創建對象時,解釋器自動調用了__new__(cls)創建對象,調用 init(self)初始化數據的過程
通過代碼進行演示,可以看到解釋器構建對象的過程:

# - 申請空間-->創建對象-->屬性初始化
# 
# - 類名(),準備創建對象,申請內存空間-->調用`__new__`()方法,創建對象-->
# 調用`__init__`()方法,對象初始化-->將創建好的對象賦值給"="左邊的變量

class User:
    """用戶類型"""
    def __init__(self,username):
        """記錄用戶屬性"""
        print("對象初始化操作")
        self.username = username
    def __new__(cls, *args, **kwargs):
        """創建對象"""
        print("開始創建對象")
        return object.__new__(cls)
user = User("穩穩")

返回文章目錄

五、對象的打印和開發

(一)對象的打印

通過對象的創建過程瞭解到,對象一旦創建完成,是將對象在內存中的地址臨時存儲在 引用變量中的,這樣通過引用變量才能訪問到對象,所以在程序中直接打印可以找到對象的 引用變量時,就會得到引用變量中存儲的內存地址數據

class User:
    """用戶類型"""
    def __init__(self,username,password,nickname):
        """記錄用戶屬性"""
        self.username = username
        self.password = password
        self.nickname = nickname

    def save(self):
        """保存方法"""
        pass

    def delete(self):
        """刪除方法"""
        print("執行刪除操作")
# 創建user對象,會自動執行__init__()方法
user = User("穩穩","123","C9")
print(user)
print(id(user))

在這裏插入圖片描述
(二)str()和repr()

項目中直接訪問對象,就會獲取到對象的內存地址,對於項目的開發人員來說,更多的 時候關注的是對象本身的數據,打印對象直接獲取對象內部關鍵數據是一種非常直觀並且非

1、str()

#可以通過 對象名.屬性名 查看屬性值,但是當屬性比較多時,查看屬性就不太方便
#打印對象時,會自動調用__str__()方法
class User:
    """用戶類型"""
    def __init__(self,username,password,nickname):
        """記錄用戶屬性"""
        self.username = username
        self.password = password
        self.nickname = nickname
    def __str__(self):
        print("--str--")
        # return "123"
        return f"{self.username} {self.password} {self.nickname}"
user = User("穩穩","123","C9")
#打印對象會自動執行__str__()方法
print(user)
print([user])

在這裏插入圖片描述
2、repr()

class User:
    """用戶類型"""
    def __init__(self,username,password,nickname):
        """記錄用戶屬性"""
        self.username = username
        self.password = password
        self.nickname = nickname
    # def __str__(self):
    #     print("--str--")
    #     return f"{self.username} {self.password} {self.nickname}"

    def __repr__(self):
        print("--repr--")
        return f"{self.username} {self.password} {self.nickname}"
user = User("穩穩","123","C9")
#打印對象會自動執行__str__()方法,如果沒有此方法,會尋找__repr__()方法
print(user)
print([user])

在這裏插入圖片描述

class Student:
    """學生類"""
    def __init__(self,name,age):
        """初始化屬性"""
        self.name = name  #stu1.name="穩穩"
        self.age = age

    def __str__(self):
        """自我介紹的方法"""
        return (f"我叫{self.name},今年{self.age}歲,請多多關照!")

stu1 = Student("穩穩",20)
print(stu1)

返回文章目錄

六、案例練習說明

1、老張開車去東北[函數式]

# 老張開車去東北
#
# ```
# 需求:發動車輛,輸入姓名,車型,到達的目的地(面向過程)
# 定義車輛發動函數,駕駛函數,到達目的地函數
# ```
import time


def start():
    """駕駛員"""
    name = input("請輸入姓名:")
    print("用戶:",name)
    #調用車輛駕駛函數
    driver(name)

def driver(name):
    """駕駛"""
    car = input("請輸入車的型號")
    print(f"{name}駕駛{car},準備出發。。。")
    area = input("請輸入要到達的目的地")
    #調用到達目的地函數
    run(area)

def run(area):
    """車行駛到達目的地"""
    for i in range(10):
        time.sleep(0.5)
        print("->",end='')
    print("經過跋山涉水,到達目的地",area)
# start()

2、老張開車去東北[面向對象]

# 面向對象開車
# 老張開車去東北
# """
# 人類
#     屬性:姓名,年齡,性別
#     方法:開車 (傳遞一個車對象,直接調用車行駛的方法,不需要關係車是如何行駛的)
# 車類
#     屬性:品牌,顏色
#     方法:行駛
# 地點類
#     屬性:省市縣
# """
class Person:
    """人的類型"""
    def __init__(self,name,age,gender):
        """屬性初始化方法"""
        self.name = name
        self.age = age
        self.gender = gender

    def driver(self,car):
        """開車,人的行爲"""
        print(f"{self.name}準備出發")
        #調用車對行駛的方法
        car.run("東北")

class Car:
    def __init__(self,brand,color):
        """屬性初始化方法"""
        self.brand = brand
        self.color = color

    def run(self,area):
        print(f"{self.color}的{self.brand}發動了,準備去{area}")

# #創建出所有參數問題的對象
per1 = Person("老張",50,"男")
qirui = Car("瑞虎5x","灰色")
per1.driver(qirui)
#
# aodi = Car("奧迪A6","白色")
# per2 = Person("老王",45,"男")
# per2.driver(aodi)

3、文章發表


#發表文章練習
"""
文章有標題,作者,內容,可以保存,數據保存在類屬性中
數據類型:可以保存數據
文章類型:
    屬性:標題,作者,內容
    方法:保存
"""

class Database:
    """數據類型"""
    #保存文章的類屬性
    article_dict = {}

class Article:
    def __init__(self,title,author,content):
        """實例屬性初始化"""
        self.title = title
        self.author = author
        self.content = content

    def save(self):
        """保存文章數據"""
        #字典根據鍵保存值的方法  self是當前文章對象
        Database.article_dict[self.title] = self

#發表文章
title = input("請輸入文章標題:")
author = input("請輸入文章作者:")
content = input("請輸入文章內容:")

#創建文章對象
article = Article(title,author,content)
#保存文章
article.save()

#查看文章數據
for title,article in Database.article_dict.items():
    print(f"標題:{title}\n文章內容:{article.content}")

返回文章目錄


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章