از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روشهای جادویی پایتون: __str__ در مقابل __repr__
سرفصلهای مطلب
معرفی
پایتون، به عنوان یک زبان سطح بالا و تفسیر شده، به دلیل خوانایی آسان با اصول طراحی عالی شناخته شده است. با این حال، وقتی عمیقتر در پایتون کاوش میکنید، اگر از زبانی آمده باشید که ویژگی مشابهی ندارد، ممکن است برخی چیزها پیچیده به نظر برسند. یکی از این ویژگیها مفهوم روشهای جادویی است، و در این بایت، ما قصد داریم از چه چیزی را رمزگشایی کنیم __str__
و __repr__
روش های جادویی عبارتند از، تفاوت های آنها، و چرا و زمان استفاده از هر کدام.
روش های جادویی چیست؟
متدهای جادویی در پایتون متدهای خاصی هستند که “جادو” را به کلاس های شما اضافه می کنند. آنها همیشه با زیرخط های دوتایی احاطه شده اند (مثلاً __init__
یا __lt__
). این روشها به روشهای dunder نیز معروف هستند که مخفف عبارت «double under» است. متدهای جادویی قرار نیست مستقیماً توسط شما فراخوانی شوند، اما فراخوانی به صورت داخلی از کلاس انجام می شود. روی یک عمل خاص به عنوان مثال، هنگامی که دو عدد را با استفاده از +
اپراتور، داخلی، __add__
متد فراخوانی خواهد شد.
class Number:
def __init__(self, num):
self.num = num
def __add__(self, other):
return self.num + other.num
num1 = Number(2)
num2 = Number(3)
print(num1 + num2)
در مثال بالا می بینید که __add__
روش برای فعال کردن استفاده از +
اپراتور. این جادوی روش های جادویی است!
متدهای جادویی میتوانند باعث شوند کلاسهای شما بیشتر شبیه به انواع داخلی پایتون عمل کنند و کد شما را بصریتر و تمیزتر کنند.
درک روش __str__
این __str__
متد در پایتون نمایش رشته “غیررسمی” یا به خوبی قابل چاپ یک شی است. این روش توسط str()
عملکرد داخلی و توسط print
تابع تبدیل شی به رشته
بیایید نگاهی به مثالی بیندازیم که در آن a را تعریف می کنیم Person
کلاس با الف __str__
روش:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'Person(name={self.name}, age={self.age})'
p = Person('John Doe', 30)
print(p)
خروجی این کد خواهد بود:
Person(name=John Doe, age=30)
در این مثال، __str__
متد رشته ای را برمی گرداند که نشان دهنده Person
شیء به شکل قابل خواندن برای انسان
درک روش __repr__
از سوی دیگر، __repr__
متد رشته ای را برمی گرداند که نمایش دقیق و بدون ابهام یک شی را توصیف می کند. هدف اصلی این روش صریح بودن اطلاعات شی است. این به معنای استفاده در اشکال زدایی و توسعه است. این __repr__
روش توسط repr()
عملکرد داخلی
در اینجا یک مثال است که در آن ما a را تعریف می کنیم Person
کلاس با الف __repr__
روش:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person(name={self.name!r}, age={self.age!r})'
p = Person('John Doe', 30)
print(repr(p))
خروجی این کد خواهد بود:
Person(name='John Doe', age=30)
در این مثال، __repr__
متد رشتهای را برمیگرداند که اگر ارزیابی شود، یک شی معادل با آن تولید میکند p
. به استفاده از !r
در رشته فرمت برای اطمینان از استفاده از رشته خروجی repr()
بجای str()
. این بخشی از تلاش برای مبهم کردن خروجی است.
توجه داشته باشید: اگر الف را تعریف نکنید __str__
متد در کلاس شما، پایتون آن را فراخوانی خواهد کرد __repr__
روش هنگام تلاش برای چاپ یک شی
تفاوت بین __str__ و __repr__
در پایتون، __str__
و __repr__
دو روش جادویی هستند که اهداف متفاوتی را دنبال می کنند. در نگاه اول، ممکن است شبیه به هم به نظر برسند زیرا هر دو نمایش رشته ای از شی را ارائه می دهند. با این حال، تفاوت اصلی بین آنها در مخاطب مورد نظر آنها و سطح جزئیات آنها نهفته است.
این __str__
هدف از این روش ارائه توصیفی مختصر و قابل خواندن برای انسان از یک شی است. این چیزی است که هنگام چاپ یک شی می بینید. از سوی دیگر، __repr__
برای ارائه یک نمایش کامل و بدون ابهام از شی در نظر گرفته شده است که برای توسعه دهندگان مفیدتر است. این چیزی است که وقتی شیء را در صفحه نمایش می دهید خواهید دید console.
در اینجا یک مثال برای نشان دادن این تفاوت آورده شده است:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'{self.name} is {self.age} years old.'
def __repr__(self):
return f'Person({self.name}, {self.age})'
p = Person('John', 30)
print(p)
p
اینجا، print(p)
را فرا می خواند __str__
متد و یک رشته قابل خواندن توسط انسان را برمی گرداند. با این حال، زمانی که شما تایپ می کنید p
در console، پایتون به آن می گوید __repr__
متد و رشته دقیق تری را برمی گرداند که می تواند برای ایجاد مجدد شی مورد استفاده قرار گیرد.
چرا و زمان استفاده از __str__
این __str__
روش در درجه اول برای ایجاد یک نمایش قابل خواندن توسط انسان از شی استفاده می شود. این یک راه عالی برای ارائه یک خلاصه یا توصیف ساده از شی است که به راحتی توسط کاربران نهایی قابل درک باشد.
ممکن است بخواهید استفاده کنید __str__
هنگامی که در حال چاپ اشیاء به منظور ورود به سیستم یا اشکال زدایی هستید، یا زمانی که می خواهید پیامی دوستانه برای کاربر نمایش دهید. برای مثال، اگر در حال توسعه یک بازی هستید، ممکن است از آن استفاده کنید __str__
برای چاپ آمار یک بازیکن در قالبی قابل خواندن.
در اینجا روش استفاده شما آمده است __str__
در یک بازی:
class Player:
def __init__(self, name, level, health):
self.name = name
self.level = level
self.health = health
def __str__(self):
return f'Player {self.name} is at level {self.level} with {self.health} health points.'
player = Player('Hero', 10, 100)
print(player)
در این مثال، __str__
متد رشته ای را برمی گرداند که خلاصه ای مختصر از وضعیت فعلی پخش کننده ارائه می دهد. این باعث می شود تا کاربران به راحتی وضعیت پخش کننده را در یک نگاه درک کنند.
چرا و زمان استفاده از __repr__
این __repr__
متد در پایتون یک متد خاص است که رشتهای را نشاندهنده نسخه قابل چاپ یک شی برمیگرداند. اما چه زمانی از آن استفاده می کنید؟ خوب، __repr__
بدون ابهام و کامل در نظر گرفته شده است. این به این معنی است که اگر یک شی دارید، __repr__
از آن شی باید تمام اطلاعات لازم برای بازآفرینی شی را در صورت بازگرداندن به مفسر داشته باشد.
این باعث می شود __repr__
برای اشکالزدایی و گزارشگیری بسیار مفید است، زیرا میتواند نمای کلی تری از یک شی را در مقایسه با __str__
. اگر با ساختارهای داده پیچیده کار می کنید یا برای عیب یابی نیاز به نمایش کاملی از شی خود دارید، __repr__
راهی برای رفتن است
توجه داشته باشید: در صورت عدم وجود تعریف شده __str__
روش، پایتون به طور پیش فرض استفاده می کند __repr__
وقتی که print()
تابع نامیده می شود روی یک شی
مثال: با استفاده از روش __str__
اکنون که در مورد آن بحث کردیم __repr__
روش، بیایید دنده ها را عوض کنیم و به چند نمونه از روش استفاده از آن نگاه کنیم __str__
روش در پایتون یاد آوردن، __str__
برای بازگرداندن یک نمایش رشته ای قابل چاپ زیبا از یک شی است که آن را برای خروجی کاربر نهایی عالی می کند.
بیایید یک ساده تعریف کنیم Person
کلاس با __str__
روش:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'Person(name={self.name}, age={self.age})'
حال، بیایید یک نمونه از Person
و آن را چاپ کنید:
p = Person('John', 28)
print(p)
خروجی:
Person(name=John, age=28)
همانطور که می بینید، print()
تابع را فرا می خواند __str__
روش و یک نمایش رشته ای کاربر پسند از ما چاپ می کند Person
هدف – شی. هنگامی که می خواهید اطلاعات شی را در قالبی خوانا و تمیز ارائه دهید، می تواند بسیار مفید باشد.
مثال: با استفاده از روش __repr__
بیایید چند مثال را برای درک کاربرد آن بررسی کنیم نماینده در پایتون کلاسی به نام “Person” را با چند ویژگی در نظر بگیرید.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
اگر نمونهای از این کلاس ایجاد کنیم و سعی کنیم آن را چاپ کنیم، یک پیام غیر مفید دریافت میکنیم.
p = Person('John Doe', 30)
print(p)
خروجی:
<__main__.Person object at 0x7f3f8e7e3d30>
اینجاست که نماینده به کار می آید بیایید نادیده بگیریم نماینده روش در کلاس ما
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person(name={self.name}, age={self.age})'
اکنون، وقتی نمونه ای از کلاس ایجاد می کنیم و آن را چاپ می کنیم، خروجی بسیار معنی داری دریافت می کنیم.
p = Person('John Doe', 30)
print(p)
خروجی:
Person(name=John Doe, age=30)
این __repr__
متد باید رشته ای را برگرداند که یک عبارت پایتون معتبر است. منظور این است که بدون ابهام و کامل باشد. این به این معنی است که اگر قرار بود خروجی آن را کپی کنید و اجرا کنید، باید همان شیئی را که چاپ شده بود دریافت کنید.
نتیجه
__str__
و __repr__
روشهای خاصی در پایتون هستند که به ما اجازه میدهند روش تبدیل اشیاء به رشتهها را کنترل کنیم. در حالی که __str__
برای ایجاد یک نمایش رشته قابل خواندن برای کاربران نهایی است، __repr__
برای ایجاد یک نمایش رشته ای بدون ابهام برای توسعه دهندگان طراحی شده است. درک تفاوت بین این دو روش و زمان استفاده از هر یک برای نوشتن کدهای تمیز و موثر پایتون بسیار مهم است.
چه در حال اشکال زدایی یا نمایش داده باشید، این روش های جادویی می توانند زندگی شما را بسیار آسان تر کنند. به یاد داشته باشید، اجرای آن همیشه یک تمرین خوب است __repr__
برای کلاس های خود و اجرا کنید __str__
اگر فکر می کنید داشتن یک نسخه رشته ای از شی که کاربر پسند است مفید است.
(برچسبها به ترجمه)# python
منتشر شده در 1402-12-29 00:38:04