وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

روش‌های جادویی پایتون: __str__ در مقابل __repr__

0 52
زمان لازم برای مطالعه: 6 دقیقه


معرفی

پایتون، به عنوان یک زبان سطح بالا و تفسیر شده، به دلیل خوانایی آسان با اصول طراحی عالی شناخته شده است. با این حال، وقتی عمیق‌تر در پایتون کاوش می‌کنید، اگر از زبانی آمده باشید که ویژگی مشابهی ندارد، ممکن است برخی چیزها پیچیده به نظر برسند. یکی از این ویژگی‌ها مفهوم روش‌های جادویی است، و در این بایت، ما قصد داریم از چه چیزی را رمزگشایی کنیم __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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید