Python - 反射

大家好,未來的Python巫師們!今天,我們將進入Python反射的神奇世界,展開一段激動人心的旅程。如果你以前從未聽說過反射,也別擔心 - 當你完成這個教程時,你將能像專家一樣進行反射!所以,拿起你的魔杖(我的意思是,鍵盤),我們一起深入探險吧!

Python - Reflection

什麼是反射?

在我們開始之前,讓我們先了解反射是什麼。在編程中,反射就像是一面鏡子,允許程序在運行時檢查、自省和修改其自己的結構和行為。這就像讓你的代碼有能力看著自己並說:“嘿,我是由什麼組成的?”非常酷,對吧?

type() 函數

讓我們從type()函數開始。這就像問一個對象:“你是什麼?”

# 示例 1: 使用 type()
x = 5
y = "Hello"
z = [1, 2, 3]

print(type(x))  # 輸出: <class 'int'>
print(type(y))  # 輸出: <class 'str'>
print(type(z))  # 輸出: <class 'list'>

在這個例子中,我們在問不同的變量它們是什麼。type()函數告訴我們x是一個整數,y是一個字符串,z是一個列表。這就像和你的變量進行對話一樣!

isinstance() 函數

接下來是isinstance()。這個函數就像問:“你是這個家庭的一部分嗎?”

# 示例 2: 使用 isinstance()
x = 5
y = "Hello"

print(isinstance(x, int))    # 輸出: True
print(isinstance(y, str))    # 輸出: True
print(isinstance(x, str))    # 輸出: False

在這裡,我們在檢查x是否是int的實例(它是),y是否是str的實例(它是),以及x是否是str的實例(它不是)。這就像問某人他們是否是某個特定俱樂部的成員一樣!

issubclass() 函數

然後是issubclass()。這個函數像是在問:“你和這個家庭有關係嗎?”

# 示例 3: 使用 issubclass()
class Animal:
pass

class Dog(Animal):
pass

print(issubclass(Dog, Animal))  # 輸出: True
print(issubclass(Animal, Dog))  # 輸出: False

在這個例子中,我們在檢查Dog是否是Animal的子類(它是),以及Animal是否是Dog的子類(它不是)。這就像問一隻貴賓犬是否是一種狗,與問所有狗是否都是貴賓犬一樣!

callable() 函數

現在,讓我們來談談callable()。這個函數檢查一個對象是否可以被調用(就像函數一樣)。

# 示例 4: 使用 callable()
def greet():
print("Hello!")

x = 5

print(callable(greet))  # 輸出: True
print(callable(x))      # 輸出: False

在這裡,我們在檢查greet(一個函數)是否可調用,以及x(只是一個數字)是否可調用。這就像問:“我可以把你當作函數使用嗎?”

getattr() 函數

getattr()是一種禮貌地問一個對象要其屬性的方式。

# 示例 5: 使用 getattr()
class Person:
name = "Alice"
age = 30

p = Person()
print(getattr(p, "name"))  # 輸出: Alice
print(getattr(p, "job", "Unemployed"))  # 輸出: Unemployed

在這個例子中,我們在向我們的Person對象索取它的name屬性,它有這個屬性。我們還在索取一個job屬性,它沒有這個屬性,所以我們提供了一個默認值“Unemployed”。

setattr() 函數

setattr()就像給一個對象一個新的屬性或更改一個現有的屬性。

# 示例 6: 使用 setattr()
class Car:
color = "red"

my_car = Car()
print(my_car.color)  # 輸出: red

setattr(my_car, "color", "blue")
print(my_car.color)  # 輸出: blue

setattr(my_car, "brand", "Toyota")
print(my_car.brand)  # 輸出: Toyota

在這裡,我們在將我們的汽車的顏色從紅色更改為藍色,然後給它一個新的brand屬性。

hasattr() 函數

hasattr()像是在問一個對象:“你有這個屬性嗎?”

# 示例 7: 使用 hasattr()
class Book:
title = "Python for Beginners"
pages = 200

my_book = Book()
print(hasattr(my_book, "title"))   # 輸出: True
print(hasattr(my_book, "author"))  # 輸出: False

在這個例子中,我們在檢查我們的Book對象是否有title屬性(它有)和author屬性(它沒有)。

dir() 函數

最後,讓我們看看dir()。這個函數像是在問一個對象:“你能做什麼?”

# 示例 8: 使用 dir()
class Dog:
def __init__(self, name):
self.name = name

def bark(self):
print("Woof!")

my_dog = Dog("Buddy")
print(dir(my_dog))

這將輸出我們的Dog對象的所有屬性和方法的名單,包括namebark,以及所有對象都有的某些內置屬性。

反射函數總結

以下是所有我們涵蓋的反射函數的快速總結:

函數 目的
type() 返回對象的類型
isinstance() 檢查對象是否是指定類的實例
issubclass() 檢查一個類是否是另一個類的子類
callable() 檢查對象是否可調用(如函數)
getattr() 獲取對象的屬性值
setattr() 設置對象的屬性值
hasattr() 檢查對象是否有特定的屬性
dir() 返回對象的屬性和方法列表

就這樣,各位!你們剛剛走出了Python反射世界的第一步。記住,這些工具就像和你的代碼進行對話一樣。它們允許你的程序檢查自己並根據它們找到的東西做出決策。這是一個強大的功能,可以使你的代碼更加靈活和動態。

在你繼續Python的旅程中,你將會發現許多其他使用反射來創建更聰明、更適應性強的程序的方法。繼續練習,繼續探索,最重要的是,繼續享受Python的樂趣!

Credits: Image by storyset