目錄
1. 面向對象編程概念(OOP)
1.1 什么是類和對象?
1.2 類的定義
1.3 類和對象的關系
1.4 小李的理解
2. 抽象
2.1 抽象的概念
2.2 抽象類和方法
2.3 小李的理解
3. 類和實例
3.1 類的定義和實例化
3.2 類的屬性和方法
3.3 小李的理解
4. 封裝/接口
4.1 封裝的概念
4.2 接口的概念
4.3 小李的理解
5. 繼承
5.1 繼承的概念
5.2 方法重寫
5.3 小李的理解
6. 多態
6.1 多態的概念
6.2 實現多態
6.3 小李的理解
7. 自省/反射
7.1 自省的概念
7.2 使用自省進行動態操作
7.3 小李的理解
8. 靜態方法和類方法
8.1 靜態方法
8.2 類方法
總結
?
專欄:python學習筆記?
上一卷:Python模塊化與包管理
1. 面向對象編程概念(OOP)
面向對象編程(OOP) 是一種編程范式,通過將程序組織成對象的集合來實現。對象不僅包含數據,還包含操作這些數據的方法。OOP的核心概念包括類、對象、屬性和方法。
1.1 什么是類和對象?
- 類(Class) 是一個模板或藍圖,用來創建對象。類定義了對象的屬性和行為。
- 對象(Object) 是類的實例。創建對象就是根據類創建一個具體的實例。
例子:
class Dog:# 類的初始化方法def __init__(self, name, age):self.name = name # 屬性self.age = age # 屬性# 方法def bark(self):return f"{self.name} says Woof!"# 創建對象
my_dog = Dog("Rex", 5)
print(my_dog.bark())
1.2 類的定義
在Python中,類通過 class
關鍵字定義。類中的函數稱為方法,變量稱為屬性。類的方法通常以 self
作為第一個參數,表示實例本身。
例子:
class Cat:def __init__(self, name):self.name = namedef meow(self):return f"{self.name} says Meow!"# 創建對象
my_cat = Cat("Whiskers")
print(my_cat.meow())
1.3 類和對象的關系
類是對象的模板,定義了對象的結構和行為。而對象是類的實例,每個對象都有獨立的屬性和方法。
class Person:def __init__(self, name, age):self.name = nameself.age = agedef greet(self):return f"Hello, my name is {self.name} and I am {self.age} years old."# 創建多個對象
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)print(person1.greet())
print(person2.greet())
1.4 小李的理解
類就像是制作餅干的模具,它定義了餅干的形狀和尺寸。而對象就像是用模具做出的具體餅干,每塊餅干可以有不同的口味(屬性),但它們的形狀和尺寸(結構和行為)都是相同的。
2. 抽象
抽象 是指對現實世界的復雜問題進行簡化,通過抓住主要特征而忽略細節。在編程中,抽象幫助我們創建更加簡潔和易維護的代碼。
2.1 抽象的概念
抽象就是提取對象的主要特征,而忽略不重要的細節。通過抽象,我們可以專注于對象的核心功能,而不被次要特征所干擾。
例子:
class Animal:def __init__(self, name):self.name = namedef make_sound(self):pass # 抽象方法,不具體實現class Dog(Animal):def make_sound(self):return "Woof!"class Cat(Animal):def make_sound(self):return "Meow!"# 創建對象
dog = Dog("Rex")
cat = Cat("Whiskers")print(dog.make_sound())
print(cat.make_sound())
2.2 抽象類和方法
在Python中,我們可以通過定義抽象類和抽象方法來實現抽象。抽象類不能被實例化,只能被繼承。抽象方法在抽象類中定義,但在子類中實現。
例子:
from abc import ABC, abstractmethodclass Vehicle(ABC):@abstractmethoddef start_engine(self):passclass Car(Vehicle):def start_engine(self):return "Car engine started"class Motorcycle(Vehicle):def start_engine(self):return "Motorcycle engine started"# 創建對象
car = Car()
motorcycle = Motorcycle()print(car.start_engine())
print(motorcycle.start_engine())
2.3 小李的理解
抽象就像是把一幅復雜的畫簡化為幾何圖形。比如,一只具體的貓有很多特征(毛色、大小、年齡等),但我們只關注它會喵喵叫的特點,這就是對貓進行的抽象。
3. 類和實例
類和實例 是OOP的基礎。類是模板,實例是具體對象。實例通過類創建,具有類定義的屬性和方法。
3.1 類的定義和實例化
定義類并創建實例是OOP的基本操作。類定義了屬性和方法,而實例則是類的具體對象。
例子:
class Student:def __init__(self, name, grade):self.name = nameself.grade = gradedef introduce(self):return f"Hi, I am {self.name} and I am in grade {self.grade}."# 創建實例
student1 = Student("Alice", 10)
student2 = Student("Bob", 12)print(student1.introduce())
print(student2.introduce())
3.2 類的屬性和方法
類的屬性是對象的狀態,方法是對象的行為。類的屬性通過 __init__
方法初始化,方法在類中定義。
例子:
class Book:def __init__(self, title, author):self.title = titleself.author = authordef get_info(self):return f"'{self.title}' by {self.author}"# 創建實例
book = Book("1984", "George Orwell")
print(book.get_info())
3.3 小李的理解
類和實例就像是房子的圖紙和實際的房子。圖紙(類)定義了房子的結構和功能,而實際的房子(實例)則是根據圖紙建造的具體對象。
4. 封裝/接口
封裝 是將對象的狀態(屬性)和行為(方法)隱藏在類內部,通過接口(方法)與外界交互。封裝提高了代碼的安全性和可維護性。
4.1 封裝的概念
封裝是OOP的核心概念之一,它通過隱藏對象的內部狀態,只暴露必要的接口,來保護對象的數據。這樣,外部代碼不能直接訪問或修改對象的內部狀態,只能通過對象提供的方法來操作數據。
例子:
class Account:def __init__(self, owner, balance=0):self.owner = ownerself.__balance = balance # 私有屬性def deposit(self, amount):if amount > 0:self.__balance += amountelse:raise ValueError("Deposit amount must be positive")def withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountelse:raise ValueError("Insufficient funds or invalid amount")def get_balance(self):return self.__balance# 創建實例
account = Account("John")
account.deposit(100)
print(account.get_balance())
4.2 接口的概念
接口是對象與外部交互的唯一方式。通過接口,外部代碼可以調用對象的方法,而不能直接訪問對象的內部狀態。
例子:
class Car:def __init__(self, model):self.model = modelself.__engine_started = Falsedef start_engine(self):if not self.__engine_started:self.__engine_started = Truereturn "Engine started"else:return "Engine is already running"def stop_engine(self):if self.__engine_started:self.__engine_started = Falsereturn "Engine stopped"else:return "Engine is not running"# 創建實例
car = Car("Toyota")
print(car.start_engine())
print(car.stop_engine())
4.3 小李的理解
封裝就像是手機的外殼。手機內部的電路和元件(對象的狀態)被封裝在外殼里面,用戶只能通過按鍵和屏幕(接口)與手機交互,而無法直接接觸內部的元件。
5. 繼承
繼承 是OOP的另一個核心概念,它允許我們基于一個現有的類創建一個新的類,新類繼承了現有類的所有屬性和方法。
5.1 繼承的概念
繼承是指一個類(子類)從另一個類(父類)獲取屬性和方法。通過繼承,子類可以復用父類的代碼,同時可以添加新的屬性和方法,或重寫父類的方法。
例子:
class Animal:def __init__(self, name):self.name = namedef speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"# 創建實例
dog = Dog("Rex")
cat = Cat("Whiskers")print(dog.speak())
print(cat.speak())
5.2 方法重寫
子類可以重寫父類的方法,即在子類中定義與父類同名的方法,從而實現不同的功能。
例子:
class Shape:def area(self):return 0class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * (self.radius ** 2)# 創建實例
rectangle = Rectangle(3, 4)
circle = Circle(5)print(rectangle.area())
print(circle.area())
5.3 小李的理解
繼承就像是父母給孩子的遺產。父母(父類)把他們的財產(屬性和方法)傳給孩子(子類),孩子不僅可以使用這些財產,還可以通過自己的努力(添加新屬性和方法)變得更加富有。
6. 多態
多態 是指同一個方法在不同的對象上具有不同的表現形式。多態允許我們通過同一個接口調用不同對象的方法,從而實現不同的功能。
6.1 多態的概念
多態是OOP的重要特性之一,它通過父類引用指向子類對象,使得同一方法可以有不同的實現。多態提高了代碼的靈活性和可擴展性。
例子:
class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"def animal_sound(animal):print(animal.speak())# 創建實例
dog = Dog()
cat = Cat()animal_sound(dog)
animal_sound(cat)
?
6.2 實現多態
在Python中,多態通常通過方法重寫和父類引用來實現。通過父類引用指向子類對象,可以調用子類的方法。
例子:
class Shape:def draw(self):passclass Rectangle(Shape):def draw(self):return "Drawing a rectangle"class Circle(Shape):def draw(self):return "Drawing a circle"def draw_shape(shape):print(shape.draw())# 創建實例
rectangle = Rectangle()
circle = Circle()draw_shape(rectangle)
draw_shape(circle)
?
6.3 小李的理解
多態就像是萬能遙控器。無論是控制電視、空調還是音響,只要這些設備有相應的接口(方法),遙控器(父類引用)就能通過相同的按鍵(方法調用)實現不同的功能。
7. 自省/反射
自省 是指對象在運行時能夠知道自己的信息。Python提供了一些內置函數用于自省,如 type()
、id()
、hasattr()
等。
7.1 自省的概念
自省是指對象能夠在運行時獲取自身的信息,如屬性、方法等。自省使得Python程序具有高度的動態性和靈活性。
例子:
class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Alice", 30)# 使用內置函數進行自省
print(type(person))
print(hasattr(person, "name"))
print(getattr(person, "name"))
setattr(person, "name", "Bob")
print(person.name)
delattr(person, "name")
7.2 使用自省進行動態操作
通過自省,我們可以在運行時動態地操作對象的屬性和方法,使得程序更加靈活和動態。
例子:
class Car:def __init__(self, model):self.model = modelself.speed = 0def accelerate(self):self.speed += 5return self.speedcar = Car("Toyota")# 動態操作對象
if hasattr(car, "accelerate"):method = getattr(car, "accelerate")print(method())print(method())# 動態設置屬性
setattr(car, "color", "red")
print(car.color)
7.3 小李的理解
自省就像是人在照鏡子。通過鏡子(自省機制),人可以看到自己的樣子(對象的屬性和方法),并根據需要進行調整(動態操作對象)。
8. 靜態方法和類方法
靜態方法 和 類方法 是與類相關聯的方法,而不是與實例相關聯的方法。靜態方法使用 @staticmethod
裝飾器,類方法使用 @classmethod
裝飾器。
8.1 靜態方法
靜態方法是類的一個方法,但它不與任何類實例綁定。靜態方法不能訪問類的實例,也不能修改類的狀態。它們通常用于執行一些與類無關的操作,但邏輯上屬于類的功能。
例子:
class Math:@staticmethoddef add(a, b):return a + bprint(Math.add(5, 3))
?
8.2 類方法
類方法是綁定到類而不是實例的方法。類方法的第一個參數是類本身,通常命名為 cls
。類方法可以訪問類的屬性和其他類方法。
例子:
class Math:factor = 2@classmethoddef multiply(cls, value):return cls.factor * valueprint(Math.multiply(5))
總結
Python的面向對象編程的各個方面,包括面向對象編程的基本概念、抽象、類和實例、封裝、繼承、多態、自省以及靜態方法和類方法。
希望這篇詳細的博客能幫助你深入理解Python的面向對象編程,并在實際項目中應用這些知識。如果你有任何問題或需要進一步的幫助,請隨時與我聯系!