راهنمای عملی فرابرنامه نویسی در پایتون
فرابرنامه نویسی چیست؟
فرابرنامهنویسی یک تکنیک برنامهنویسی است که در آن یک برنامه میتواند کد را در زمان اجرا تغییر داده یا تولید کند. این به توسعه دهندگان اجازه می دهد تا کدی بنویسند که می تواند کدهای دیگری را تجزیه و تحلیل، اصلاح یا ایجاد کند.
به عبارت دیگر، فرابرنامهنویسی راهی برای نوشتن برنامههایی است که برنامهها را دستکاری میکنند.
فرابرنامهنویسی در بسیاری از زبانها از جمله پایتون، جاوا اسکریپت، روبی، کلوژور، جولیا و جاوا پشتیبانی میشود (اگرچه زبان بسیار ثابت و پرمخاطب در نظر گرفته میشود!)
” loading=”lazy” width=”664″ height=”557″/>
شکل: رابطه بین مفاهیم ساختاری و فرآیندی فرابرنامه ریزی. تصویر از گیت تحقیق
فرابرنامه نویسی کجا استفاده می شود؟
فرابرنامهنویسی برای بسیاری از موارد مفید است. برخی از آنها عبارتند از
- چارچوب ها و کتابخانه ها
- تولید کد
- موتورهای قالب
فرابرنامه نویسی در پایتون
فرابرنامهنویسی در پایتون به شما امکان میدهد کدی بنویسید که بتواند خود کد را دستکاری کند، کد جدید ایجاد کند، کد موجود را تغییر دهد یا ساختار کد را تجزیه و تحلیل کند. پایتون مکانیسم های مختلفی را برای فرابرنامه نویسی ارائه می دهد. بیایید هر یک از آنها را با مثال کد بررسی کنیم:
1. دکوراتورها
دکوراتورها عملکردهایی هستند که رفتار سایر عملکردها یا کلاس ها را تغییر می دهند. آنها تابع یا کلاس هدف را بسته بندی می کنند و عملکرد اضافی را ارائه می دهند. دکوراتورها از علامت @ استفاده می کنند و می توانند برای توابع یا کلاس ها اعمال شوند. در اینجا یک مثال است:
def uppercase_decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
@uppercase_decorator
def greet(name):
return f"Hello, {name}!"
print(greet("Karishma"))
خروجی
HELLO, KARISHMA!
در مثال بالا، uppercase_decorator
رفتار را تغییر می دهد greet
تابع با تبدیل مقدار بازگشتی آن به حروف بزرگ.
2. متاکلاس ها
متاکلاس ها به شما این امکان را می دهند که رفتار کلاس ها را تعریف کنید. آنها به عنوان طرح اولیه برای ایجاد کلاس ها عمل می کنند و می توانند ایجاد و رفتار کلاس را تغییر دهند. در اینجا یک مثال است:
class MetaClass(type):
def __new__(cls, name, bases, attrs):
uppercase_attrs = {key.upper(): value for key, value in attrs.items() if not key.startswith('__')}
return super().__new__(cls, name, bases, uppercase_attrs)
class MyClass(metaclass=MetaClass):
message = "Hello, World!"
print(MyClass.MESSAGE)
خروجی
Hello, World!
در مثال بالا، MetaClass
متاکلاس ویژگی های the را تغییر می دهد MyClass
کلاس با تبدیل آنها به حروف بزرگ.
3. کارکرد و کلاس دکوراتور
علاوه بر استفاده از دکوراتورها با نماد @، می توانید دکوراتورها را با استفاده از تابع یا نحو کلاس نیز اعمال کنید. در اینجا یک مثال است:
class CubeCalculator:
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
# before function
result = self.function(*args, **kwargs)
# after function
return result
# adding class decorator to the function
@CubeCalculator
def get_cube(n):
print("Input number:", n)
return n * n * n
print("Cube of number:", get_cube(100))
خروجی
Input number: 100
Cube of number: 1000000
در مثال بالا یک کلاس دکوراتور را تعریف می کنیم CubeCalculator
که تابع را می پیچد get_cube
برای انجام اقدامات اضافی قبل و بعد از اجرای آن و سپس اعمال دکوراتور به get_cube
تابع. چه زمانی get_cube
با یک عدد ورودی فراخوانی می شود، عدد ورودی را چاپ می کند، مکعب آن را محاسبه می کند و نتیجه را برمی گرداند.
4. تولید کد پویا
پایتون به شما اجازه می دهد تا با استفاده از تکنیک هایی مانند eval() یا exec() کد را به صورت پویا تولید کنید. این می تواند برای تولید کد بر اساس شرایط خاص یا ایجاد پویا توابع یا کلاس ها مفید باشد. در اینجا یک مثال است:
name = "Karishma"
age = 2
code = f'def greet():\n print("Name: {name}")\n print("Age: {age}")'
exec(code)
greet()
در مثال بالا، رشته کد به صورت پویا تولید و با استفاده از آن اجرا می شود exec()
برای تعریف تابع سلام.
رایج ترین کلمات کلیدی داخلی و توابع برای فرابرنامه نویسی در پایتون
در پایتون، کلمات کلیدی و مفاهیم زیر معمولاً با فرابرنامهنویسی مرتبط هستند و پایه و اساس فرابرنامهنویسی را فراهم میکنند:
-
getattr()
،dir()
،hasattr()
: این توابع به شما این امکان را می دهند که به صورت پویا ویژگی های یک شی را در زمان اجرا دریافت و تنظیم کنید. ساخته شده درinspect
ماژول مسئول مفهوم مهم فرابرنامه نویسی به نام درون نگری است که در آن برنامه به سادگی به خود نگاه می کند و گزارش می دهد. -
exec()
،eval()
وcompile()
: این توابع امکان اجرای رشته های کد تولید شده به صورت پویا یا ارزیابی عبارات را فراهم می کنند. -
__getattr__()
و__setattr__()
: این متدهای ویژه را می توان در کلاس ها تعریف کرد تا دسترسی و تخصیص ویژگی ها را به صورت پویا انجام دهد. -
__metaclass__
: این ویژگی خاص را می توان در تعریف کلاس برای تعیین متاکلاس برای آن کلاس استفاده کرد.
نتیجه
اینها برخی از راههای دستیابی به فرابرنامهنویسی در پایتون هستند. هر تکنیک انعطاف پذیری را در دستکاری ساختارها و رفتار کد فراهم می کند و شما را قادر می سازد تا برنامه های کاربردی پویا و انعطاف پذیرتری ایجاد کنید.
اگر مطالبی را که می خوانید دوست دارید، در خبرنامه من مشترک شوید.
مرا در GitHub پیدا کنید، توییتر