Python入門-Day8:物件導向

更新於 發佈於 閱讀時間約 14 分鐘

類別(Class)

在Python中,我們可以使用class關鍵字來定義一個類別。類別是一種包含相關方法和變數的模板。

以下是一個Python類別的範例,這個類別定義了一個名為Car的類別,並包含一個變數color和一個方法drive:

class Car:
def __init__(self, color):
self.color = color

def drive(self):
print("The " + self.color + " car is driving")

在這個範例中,__init__是一個特殊的方法,稱為類別的建構函數。這個方法在創建類別的實例時會被調用,並將參數color設定為該實例的屬性。

drive方法是我們為Car類別定義的一個方法,這個方法會輸出一條訊息。

我們可以創建一個Car類別的實例,並呼叫其方法,如下所示:

my_car = Car("red")
my_car.drive()

輸出將為:

The red car is driving

繼承(Inheritance)

在Python中,一個類別可以繼承另一個類別的屬性和方法,這種概念被稱為繼承。我們可以使用super()函數來繼承父類別的屬性和方法。

以下是一個繼承的程式碼範例:

class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname

class Student(Person):
pass

x = Student("Mike", "Olsen")
print(x.firstname)
print(x.lastname)

在這個範例中,有兩個類別:PersonStudentPerson 類別是父類別,它有兩個屬性 firstnamelastnameStudent 類別是子類別,它繼承了 Person 類別的所有屬性和方法。

當我們創建 Student 類別的對象 x 時,我們可以使用 Person 類別的屬性。在這個例子中,我們給 x 設定了 firstname 為 "Mike",lastname 為 "Olsen",然後我們可以打印出這兩個屬性。

繼承允許我們重用代碼,因為我們可以使用父類別的屬性和方法,而不需要在每個子類別中重新定義它們。這也使得我們的代碼更易於維護。

多型(Polymorphism)

在Python中,多型意味著我們可以定義具有相同名稱但具有不同實現的方法。多型允許我們在不考慮它們的類型的情況下使用這些方法。

以下是一個多型的程式碼範例:

class Parrot:

def fly(self):
print("Parrot can fly")

def swim(self):
print("Parrot can't swim")

class Penguin:

def fly(self):
print("Penguin can't fly")

def swim(self):
print("Penguin can swim")

def flying_test(bird):
bird.fly()

blu = Parrot()
peggy = Penguin()

flying_test(blu)
flying_test(peggy)

在這個範例中,我們定義了兩個類別:ParrotPenguin。每個類別都有一個 fly 和一個 swim 方法,但它們的實現是不同的。

然後,我們定義了一個名為 flying_test 的函數,它接受一個 bird 參數,並調用該參數的 fly 方法。

最後,我們創建了一個 Parrot 物件 blu 和一個 Penguin 物件 peggy,並將它們傳遞給 flying_test 函數。儘管 blupeggy 是不同類別的物件,但因為它們都有一個 fly 方法,所以我們可以在不知道它們類別的情況下使用這個方法。這就是多型的概念。

封裝(Encapsulation)

在Python中,我們可以將物件的狀態(變數)和行為(方法)封裝在一起。這樣可以保護數據,並防止外部程式直接訪問或修改物件的狀態。

以下是一個封裝的程式碼範例:

class Computer:

def __init__(self):
self.__maxprice = 900

def sell(self):
print("Selling Price: {}".format(self.__maxprice))

def setMaxPrice(self, price):
self.__maxprice = price

c = Computer()
c.sell()

c.__maxprice = 1000
c.sell()

c.setMaxPrice(1000)
c.sell()

在此範例中,我們定義了一個名為 Computer 的類別,並將一個名為 __maxprice 的變數封裝在類別中。我們還定義了兩個方法:sellsetMaxPrice

當我們創建一個 Computer 物件 c 並嘗試改變 __maxprice 變數時,我們會發現我們無法直接訪問或修改此變數。這是因為我們已將 __maxprice 變數封裝在 Computer 類別中,並將其設為私有。

然而,我們可以使用定義在類別中的 setMaxPrice 方法來更改 __maxprice 變數的值。這就是封裝的概念,我們可以將物件的狀態和行為封裝在一起,並通過提供公共方法來訪問和修改這些私有變數,從而保護數據,並防止外部程式直接訪問或修改物件的狀態。

介面(Interface)

Python並不具有專門的介面概念。但我們可以透過建立一個只包含抽象方法的類別來模擬介面的行為。

抽象類別(Abstract Class)

在Python中,抽象類別是一種只能被繼承,不能被實例化的類別。抽象類別可以定義抽象方法,這些方法必須在子類別中實現。

以下是抽象類別的程式碼範例:

from abc import ABC, abstractmethod

class AbstractClassExample(ABC):

@abstractmethod
def do_something(self):
pass

class AnotherSubclass(AbstractClassExample):

def do_something(self):
super().do_something()
print("The subclass is doing something")

x = AnotherSubclass()
x.do_something()

在這個範例中,AbstractClassExample 是一個抽象類別,它有一個抽象方法 do_something。這個抽象方法在 AbstractClassExample 類別中沒有實現,必須在任何繼承 AbstractClassExample 的子類別中實現。在這個例子中,AnotherSubclass 繼承了 AbstractClassExample 並實現了 do_something 方法。然後我們創建了一個 AnotherSubclass 的實例 x,並呼叫了其 do_something 方法。結果將為 "The subclass is doing something"。

靜態類別(Static Class)

Python並沒有靜態類別的概念。但我們可以透過在類別中只使用靜態方法來模擬靜態類別的行為。

列舉(Enumerations)

Python有一個內建的列舉類型 Enum,我們可以用它來創建具有有限數量的值的類別。

以下是一個列舉的程式碼範例:

from enum import Enum

class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3

print(Color.RED)
print(Color.GREEN)
print(Color.BLUE)

在這個範例中,我們定義了一個名為Color的列舉,並給它指定了三個值:REDGREENBLUE。然後我們可以像使用常數一樣使用這些列舉值。當我們列印出這些值時,我們會得到它們的名稱和對應的數值。

列舉是一種用於定義只有固定數量值的類型的有效方式。在Python中,列舉可以提供更清晰的語義並且易於維護。

委派(Delegation)

Python中的委派通常是通過組合或繼承來實現的。

以下是一個「委派」的程式碼範例:

class Printer:
def print_file(self, file):
print("Printing file: " + file)

class User:
def __init__(self):
self.printer = Printer()

def print(self, file):
self.printer.print_file(file)

user = User()
user.print("file.txt")

在這個範例中,我們定義了兩個類別:PrinterUserPrinter 類別有一個 print_file 方法,用於列印檔案。User 類別有一個 print 方法,但這個方法並不直接列印檔案,而是將這個任務「委派」給 Printer 類別的 print_file 方法。這樣,當我們要列印檔案時,我們只需要調用 User 類別的 print 方法即可,而不需要關心列印的具體實現。這就是「委派」的概念,它允許我們將一些特定的任務分配給其他的類別或者方法來執行,從而簡化程式碼並提高可維護性。

Lambda 表達式

Python支持lambda表達式,也稱為匿名函數,允許我們快速定義單行的小函數。

以下是一個Lambda表達式的程式碼範例:

square = lambda x: x ** 2
print(square(5))

在這個範例中,我們定義了一個Lambda表達式,它接收一個參數x,並返回x的平方。然後,我們呼叫這個Lambda表達式,並且將值5傳入,它將返回25。

Lambda表達式是一種快速定義簡單函數的方式,它們通常在需要短暫使用一次的函數或者將函數作為參數傳遞給其他函數的時候非常有用。雖然Lambda表達式功能強大,但它們的使用應該是有限的,因為使用正規的def定義的函數會更具可讀性。

泛型(Generics)

Python並不直接支持泛型,但可通過使用類型提示來模擬泛型行為。

反射(Reflection)

Python有反射功能,可以允許我們在運行時檢視對象的類型和屬性,並且可以調用其方法或修改其屬性。

下面是反射的程式碼範例:

class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def say_hello(self):
print("Hello, my name is " + self.name)

person = Person("John", 30)

# 使用 type() 函數獲取對象的類型
print(type(person))

# 使用 hasattr() 函數檢查對象是否有特定屬性
print(hasattr(person, 'name'))
print(hasattr(person, 'address'))

# 使用 getattr() 函數獲取對象的屬性值
print(getattr(person, 'name'))

# 使用 setattr() 函數設定對象的屬性值
setattr(person, 'name', 'Bob')
print(getattr(person, 'name'))

# 使用 dir() 函數獲取對象的所有屬性和方法
print(dir(person))

# 使用 callable() 函數檢查對象的方法是否可以調用
print(callable(getattr(person, 'say_hello')))

# 調用對象的方法
getattr(person, 'say_hello')()

在這個範例中,我們定義了一個名為Person的類別,並創建了一個對應的實例person。我們使用了type()hasattr()getattr()setattr()dir()callable()等反射函數來檢視和操作對象。

首先,我們使用type()函數來獲取person對象的類型。然後,我們使用hasattr()函數來檢查person對象是否具有nameaddress兩個屬性。接著,我們使用getattr()函數來獲取name屬性的值,並使用setattr()函數來改變name屬性的值。之後,我們使用dir()函數來列出person對象的所有屬性和方法。最後,我們使用callable()函數來檢查say_hello方法是否可以調用,並調用此方法。

這個範例顯示了Python反射的基本用法,通過反射,我們可以在運行時檢視和操作對象,這對於動態語言來說是非常有用的一種能力。

留言
avatar-img
留言分享你的想法!
avatar-img
Michael楊
17會員
111內容數
日後將分享關於我的經驗(日常、工作、技術),並期待未來能創造屬於我的宇宙。
Michael楊的其他內容
2024/05/18
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
2024/05/18
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
2024/05/16
例外處理是Python中的重要概念,用於控制並處理程序異常,防止程序崩潰和數據損失。它包括try, except, else和finally等語法結構,可用於對特定錯誤進行處理,或主動觸發和自定義異常。
Thumbnail
2024/05/16
例外處理是Python中的重要概念,用於控制並處理程序異常,防止程序崩潰和數據損失。它包括try, except, else和finally等語法結構,可用於對特定錯誤進行處理,或主動觸發和自定義異常。
Thumbnail
2024/05/14
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
2024/05/14
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
Thumbnail
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
Thumbnail
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News