1. 程式人生 > 程式設計 >Python面向物件原理與基礎語法詳解

Python面向物件原理與基礎語法詳解

本文例項講述了Python面向物件原理與基礎語法。分享給大家供大家參考,具體如下:

目標

dir 內建函式
定義簡單的類(只包含方法)
方法中的 self 引數
初始化方法
內建方法和屬性

01. dir 內建函式(知道)

在 Python 中 物件幾乎是無所不在的,我們之前學習的 變數、資料、函式 都是物件
在 Python 中可以使用以下兩個方法驗證:

在 識別符號 / 資料 後輸入一個 .,然後按下 TAB 鍵,iPython 會提示該物件能夠呼叫的 方法列表
使用內建函式 dir 傳入 識別符號 / 資料,可以檢視物件內的 所有屬性及方法
提示 方法名 格式的方法是 Python 提供的 內建方法 / 屬性,稍後會給大家介紹一些常用的 內建方法 / 屬性

在這裡插入圖片描述
提示 利用好 dir() 函式,在學習時很多內容就不需要死記硬背了

02. 定義簡單的類(只包含方法)

面向物件 是 更大 的 封裝,在 一個類中 封裝 多個方法,這樣 通過這個類創建出來的物件,就可以直接呼叫這些方法了!

2.1 定義只包含方法的類

在 Python 中要定義一個只包含方法的類,語法格式如下:

class 類名:

  def 方法1(self,引數列表):
    pass
  
  def 方法2(self,引數列表):
    pass

方法 的定義格式和之前學習過的函式 幾乎一樣
區別在於第一個引數必須是 self,大家暫時先記住,稍後介紹 self
注意:類名 的 命名規則 要符合 大駝峰命名法

2.2 建立物件

當一個類定義完成之後,要使用這個類來建立物件,語法格式如下:

物件變數 = 類名()

2.3 第一個面向物件程式

需求

小貓 愛 吃 魚,小貓 要 喝 水
分析

定義一個貓類 Cat
定義兩個方法 eat 和 drink
按照需求 —— 不需要定義屬性
在這裡插入圖片描述

class Cat:
  """這是一個貓類"""

  def eat(self):
    print("小貓愛吃魚")

  def drink(self):
    print("小貓在喝水")

tom = Cat()
tom.drink()
tom.eat()

引用概念的強調
在面向物件開發中,引用的概念是同樣適用的!

在 Python 中使用類 建立物件之後,tom 變數中 仍然記錄的是 物件在記憶體中的地址
也就是 tom 變數 引用 了 新建的貓物件
使用 print 輸出 物件變數,預設情況下,是能夠輸出這個變數 引用的物件 是 由哪一個類建立的物件,以及 在記憶體中的地址(十六進位制表示)
提示:在計算機中,通常使用 十六進位制 表示 記憶體地址

十進位制 和 十六進位制 都是用來表達數字的,只是表示的方式不一樣
十進位制 和 十六進位制 的數字之間可以來回轉換
%d 可以以 10 進位制 輸出數字
%x 可以以 16 進位制 輸出數字
案例進階 —— 使用 Cat 類再建立一個物件

lazy_cat = Cat()
lazy_cat.eat()
lazy_cat.drink()

03. 方法中的 self 引數

3.1 案例改造 —— 給物件增加屬性

在 Python 中,要 給物件設定屬性,非常的容易,但是不推薦使用
因為:物件屬性的封裝應該封裝在類的內部
只需要在 類的外部的程式碼 中直接通過 . 設定一個屬性即可
注意:這種方式雖然簡單,但是不推薦使用!

tom.name = "Tom"
...

lazy_cat.name = "大懶貓"

3.2 使用 self 在方法內部輸出每一隻貓的名字

由 哪一個物件 呼叫的方法,方法內的 self 就是 哪一個物件的引用

在類封裝的方法內部,self 就表示 當前呼叫方法的物件自己
呼叫方法時,程式設計師不需要傳遞 self 引數
在方法內部
可以通過 self. 訪問物件的屬性
也可以通過 self. 呼叫其他的物件方法
改造程式碼如下:

class Cat:

  def eat(self):
    print("%s 愛吃魚" % self.name)

tom = Cat()
tom.name = "Tom"
tom.eat()

lazy_cat = Cat()
lazy_cat.name = "大懶貓"
lazy_cat.eat()

在這裡插入圖片描述
在 類的外部,通過 變數名. 訪問物件的 屬性和方法
在 類封裝的方法中,通過 self. 訪問物件的 屬性和方法

04. 初始化方法

4.1 之前程式碼存在的問題 —— 在類的外部給物件增加屬性

將案例程式碼進行調整,先呼叫方法 再設定屬性,觀察一下執行效果

tom = Cat()
tom.drink()
tom.eat()
tom.name = "Tom"
print(tom)

程式執行報錯如下:

AttributeError: 'Cat' object has no attribute 'name'
屬性錯誤:'Cat' 物件沒有 'name' 屬性

提示

在日常開發中,不推薦在 類的外部 給物件增加屬性
如果在執行時,沒有找到屬性,程式會報錯
物件應該包含有哪些屬性,應該 封裝在類的內部

4.2 初始化方法

當使用 類名() 建立物件時,會 自動 執行以下操作:
為物件在記憶體中 分配空間 —— 建立物件
為物件的屬性 設定初始值 —— 初始化方法(init)
這個 初始化方法 就是 init 方法,init 是物件的內建方法
init 方法是 專門 用來定義一個類 具有哪些屬性的方法!

在 Cat 中增加 init 方法,驗證該方法在建立物件時會被自動呼叫

class Cat:
  """這是一個貓類"""

  def __init__(self):
    print("初始化方法")

4.3 在初始化方法內部定義屬性

init 方法內部使用 self.屬性名 = 屬性的初始值 就可以 定義屬性
定義屬性之後,再使用 Cat 類建立的物件,都會擁有該屬性

class Cat:

  def __init__(self):

    print("這是一個初始化方法")
    
    # 定義用 Cat 類建立的貓物件都有一個 name 的屬性
    self.name = "Tom"

  def eat(self):
    print("%s 愛吃魚" % self.name)

# 使用類名()建立物件的時候,會自動呼叫初始化方法 __init__
tom = Cat()

tom.eat()

4.4 改造初始化方法 —— 初始化的同時設定初始值

在開發中,如果希望在 建立物件的同時,就設定物件的屬性,可以對 init 方法進行 改造
把希望設定的屬性值,定義成 init 方法的引數
在方法內部使用 self.屬性 = 形參 接收外部傳遞的引數
在建立物件時,使用 類名(屬性1,屬性2…) 呼叫

class Cat:

  def __init__(self,name):
    print("初始化方法 %s" % name)
    self.name = name
  ...
  
tom = Cat("Tom")
...

lazy_cat = Cat("大懶貓")
...

05. 內建方法和屬性

在這裡插入圖片描述

5.1 del 方法(知道)

在 Python 中

當使用 類名() 建立物件時,為物件 分配完空間後,自動 呼叫 init 方法
當一個 物件被從記憶體中銷燬 前,會 自動 呼叫 del 方法
應用場景

init 改造初始化方法,可以讓建立物件更加靈活
del 如果希望在物件被銷燬前,再做一些事情,可以考慮一下 del 方法
生命週期

一個物件從呼叫 類名() 建立,生命週期開始
一個物件的 del 方法一旦被呼叫,生命週期結束
在物件的生命週期內,可以訪問物件屬性,或者讓物件呼叫方法
class Cat:

class Cat:

  def __init__(self,new_name):

    self.name = new_name

    print("%s 來了" % self.name)

  def __del__(self):

    print("%s 去了" % self.name)

# tom 是一個全域性變數
tom = Cat("Tom")
print(tom.name)

# del 關鍵字可以刪除一個物件
del tom

print("-" * 50)

5.2 str 方法

在 Python 中,使用 print 輸出 物件變數,預設情況下,會輸出這個變數 引用的物件 是 由哪一個類建立的物件,以及 在記憶體中的地址(十六進位制表示)
如果在開發中,希望使用 print 輸出 物件變數 時,能夠列印 自定義的內容,就可以利用 str 這個內建方法了
注意:str 方法必須返回一個字串

class Cat:

  def __init__(self,new_name):

    self.name = new_name

    print("%s 來了" % self.name)

  def __del__(self):

    print("%s 去了" % self.name)

  def __str__(self):
    return "我是小貓:%s" % self.name

tom = Cat("Tom")
print(tom)

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python面向物件程式設計入門與進階教程》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。