Python ialah bahasa pengaturcaraan serba boleh dan berkuasa yang menawarkan pelbagai ciri lanjutan. Kertas putih ini meneroka empat konsep lanjutan utama: penghias, penjana dan iterator, pengurus konteks dan kelas meta. Ciri ini membolehkan pembangun menulis kod yang lebih cekap, boleh dibaca dan boleh diselenggara. Walaupun konsep ini mungkin kelihatan rumit pada mulanya, pemahaman dan penggunaannya boleh meningkatkan kemahiran pengaturcaraan Python anda dengan ketara.
Penghias ialah cara yang berkuasa dan fleksibel untuk mengubah suai atau meningkatkan fungsi atau kelas tanpa menukar kod sumbernya secara langsung. Pada asasnya ia adalah fungsi yang mengambil fungsi lain (atau kelas) sebagai hujah dan mengembalikan versi diubah suai bagi fungsi itu (atau kelas).
Sintaks asas untuk menggunakan penghias ialah:
@decorator_function def target_function(): pass
Ini bersamaan dengan:
def target_function(): pass target_function = decorator_function(target_function)
Mari kita buat penghias ringkas yang merekodkan pelaksanaan fungsi:
def log_execution(func): def wrapper(*args, **kwargs): print(f"Executing {func.__name__}") result = func(*args, **kwargs) print(f"Finished executing {func.__name__}") return result return wrapper @log_execution def greet(name): print(f"Hello, {name}!") greet("Alice")
Output:
Executing greet Hello, Alice! Finished executing greet
Penghias juga boleh menerima hujah. Ini dicapai dengan menambah satu lagi lapisan fungsi:
def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(3) def say_hello(): print("Hello!") say_hello()
Output:
Hello! Hello! Hello!
Penghias juga boleh digunakan untuk kelas:
def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton class DatabaseConnection: def __init__(self): print("Initializing database connection") # This will only print once, even if called multiple times db1 = DatabaseConnection() db2 = DatabaseConnection()
Penghias ialah alat yang berkuasa untuk mengubah suai tingkah laku dan menambahkan fungsi pada kod sedia ada tanpa mengubah strukturnya.
Penjana dan iterator ialah ciri berkuasa dalam Python yang membolehkan pengendalian cekap set data besar dan penciptaan corak lelaran tersuai.
Interator ialah objek yang boleh diulang (digelung). Ia mewakili aliran data dan mengembalikan satu elemen pada satu masa. Dalam Python, sebarang objek yang melaksanakan kaedah __iter__() dan __next__() ialah lelaran.
class CountDown: def __init__(self, start): self.count = start def __iter__(self): return self def __next__(self): if self.count <= 0: raise StopIteration self.count -= 1 return self.count for i in CountDown(5): print(i)
Output:
4 3 2 1 0
Penjana ialah cara mudah untuk mencipta iterator menggunakan fungsi. Daripada menggunakan pernyataan pulangan, penjana menggunakan hasil untuk menghasilkan satu siri nilai.
def fibonacci(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + b for num in fibonacci(10): print(num, end=" ")
Output:
0 1 1 2 3 5 8 13 21 34
Ekspresi penjana ialah cara ringkas untuk mencipta penjana, sama seperti menyenaraikan pemahaman tetapi dengan tanda kurungan dan bukannya kurungan segi empat sama:
squares = (x**2 for x in range(10)) print(list(squares))
Output:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Penjana adalah cekap memori kerana ia menjana nilai dengan segera dan bukannya menyimpan kesemuanya dalam ingatan sekaligus.
Pengurus konteks menyediakan cara yang mudah untuk mengurus sumber, memastikan pemerolehan dan pelepasan sumber yang betul seperti pemegang fail atau sambungan rangkaian.
Cara paling biasa untuk menggunakan pengurus konteks ialah dengan pernyataan dengan:
with open('example.txt', 'w') as file: file.write('Hello, World!')
Ini memastikan fail ditutup dengan betul selepas menulis, walaupun pengecualian berlaku.
Anda boleh mencipta pengurus konteks anda sendiri dengan melaksanakan kaedah __enter__() dan __exit__():
class DatabaseConnection: def __enter__(self): print("Opening database connection") return self def __exit__(self, exc_type, exc_value, traceback): print("Closing database connection") def query(self, sql): print(f"Executing SQL: {sql}") with DatabaseConnection() as db: db.query("SELECT * FROM users")
Output:
Opening database connection Executing SQL: SELECT * FROM users Closing database connection
Modul contextlib menyediakan utiliti untuk bekerja dengan pengurus konteks, termasuk penghias @contextmanager:
from contextlib import contextmanager @contextmanager def tempdirectory(): print("Creating temporary directory") try: yield "temp_dir_path" finally: print("Removing temporary directory") with tempdirectory() as temp_dir: print(f"Working in {temp_dir}")
Output:
Creating temporary directory Working in temp_dir_path Removing temporary directory
Pengurus konteks membantu memastikan sumber diurus dan dibersihkan dengan betul, mengurangkan risiko kebocoran sumber dan menjadikan kod lebih mantap.
Metaclass ialah kelas untuk kelas. Mereka mentakrifkan cara kelas berkelakuan dan dicipta. Walaupun tidak biasa digunakan dalam pengaturcaraan harian, metaclass boleh menjadi alat yang berkuasa untuk mencipta API dan rangka kerja.
Dalam Python, jenis objek ialah kelas, dan jenis kelas ialah metaclass. Secara lalai, Python menggunakan jenis metaclass untuk mencipta kelas.
class MyClass: pass print(type(MyClass)) # <class 'type'>
Berikut ialah contoh metaclass ringkas yang menambahkan atribut kelas pada semua kelas yang diciptanya:
class AddClassAttribute(type): def __new__(cls, name, bases, dct): dct['added_attribute'] = 42 return super().__new__(cls, name, bases, dct) class MyClass(metaclass=AddClassAttribute): pass print(MyClass.added_attribute) # 42
Metaclasses boleh digunakan untuk melaksanakan corak reka bentuk, seperti corak Singleton:
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class Database(metaclass=Singleton): def __init__(self): print("Initializing Database") # This will only print once db1 = Database() db2 = Database() print(db1 is db2) # True
The abc module in Python uses metaclasses to implement abstract base classes:
from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def make_sound(self): pass class Dog(Animal): def make_sound(self): return "Woof!" # This would raise an error: # animal = Animal() dog = Dog() print(dog.make_sound()) # Woof!
Metaclasses are a powerful feature that allows you to customize class creation and behavior. While they're not needed for most programming tasks, understanding metaclasses can give you deeper insight into Python's object system and can be useful for creating advanced frameworks and APIs.
This whitepaper has explored four advanced Python concepts: decorators, generators and iterators, context managers, and metaclasses. These features provide powerful tools for writing more efficient, readable, and maintainable code. While they may seem complex at first, mastering these concepts can significantly enhance your Python programming skills and open up new possibilities in your software development projects.
Remember that while these advanced features are powerful, they should be used judiciously. Clear, simple code is often preferable to overly clever solutions. As with all aspects of programming, the key is to use the right tool for the job and to always prioritize code readability and maintainability.
Atas ialah kandungan terperinci Konsep Python Lanjutan: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!