tgoop.com/lython/66
Create:
Last Update:
Last Update:
Data Class in python- part 1
✓ طبق تعریف کتاب وزین Fluent Python میتوان تعریف جالبی برای دیتا کلاسها ارائه داد.
Python offers a few ways to build a simple class that is just a collection of fields, with little or no extra functionality. p163
✓ درواقع دیتا کلاسها ذاتا ظرفی هستن برای نگهداری دادهها، متدها در این نوع کلاس نقش بسیار کمرنگی ایفا میکنند یا حتی میتوان گفت، هیچ نقشی ندارند. مگر این که کاربرد متدی به نگهداری یا تغییر دادهها مربوط باشد.
به هر حال میتوان به سه نوع نوشتن دیتا کلاسها اشاره کرد.
1- @dataclasses.dataclass (python +3.7)
2- collections.namedtuple (python +2.6)
3- typing.NamedTuple (python +3.6)
✓ کتاب مثال جالبی زده است، فرض کنید که ما صرفا میخواهیم کلاسی تحت عنوان Coordinate تعریف کنیم که مختصات را در خود ذخیره کند.
class Coordinate:
def __init__(self, lat, lon):
self.lat = lat
self.lon = lon
✓ این کلاس به راحتی قابل تعریف بود، اما ایراداتی را دارد که در ادامه به بیان آنها خواهیم پرداخت. به کد زیر دقت کنید.
moscow = Coordinate(55.76, 37.62)
location = Coordinate(55.76, 37.62)
✓ دقت شود که مختصات جفت این ها یکسان است ولی وقتی با == دو لوکیشن را مقایسه میکنیم به نتیجه دلخواه نخواهیم رسید زیرا مکان آن دو در حافظه درحال مقایسه است.
>>> location == moscow
False
>>> moscow
<coordinates.Coordinate object at 0x107142f10>
✓ پس دو مشکل اصلی را در حال نظارهایم، یکی این که مجیک متد __repr__ را باید بازنویسی کنیم و به بازنویسی مجیک متد __eq__ نیز نیازمندیم. در ادامه از اولین نوع دیتا کلاس استفاده خواهیم کرد. به کد زیر دقت کنید.
from dataclasess import dataclass
@dataclass(frozen=True)
class Coordinate:
lat: float
lon: float
moscow = Coordinate(lat= 55.76, lon= 37.62 )
location = Coordinate(lat= 55.76, lon= 37.62 )
✓ دقت شود که این نوع دیتا کلاس از تایپ هینت برای تعریف خود استفاده میکند و تایپ هینت یک نوع نوشتن آپشنال و اختیاری است و به هیچ عنوان قرار هم نیست که اجباری شود و فقط یک استثنا دارد آن هم دیتا کلاس است که باید در آن این Annotation رعایت گردد.
✓ مقدار
frozen
برابر True قرار داده شده، تا کلاس ایجاد شده immutable شود.✓ نکتهی دیگری که باید در نظر گرفت، بهتر است که آرگومانهای ورودی به صورت keyword only به دیتا کلاس برای ایجاد شیٔ داده شود زیرا ترتیب آرگومانهای ورودی اینجا اهمیت دارد.
مشکلاتی که در تعریف قبلی کلاس
Coordinate
به آن اشاره کردیم، در تعریف جدید به لطف باهوش بودن سازندگان پایتون حل شده است. کد زیر خود موضوع را روشن میکند.>>>moscow == location
True
>>>moscow
Coordinate(lat= 55.76, lon= 37.62 )
یعنی دو مجیک متد ذکر شده برای دیتاکلاس ما از پیش تعریف شده است.
@lython
BY روزمرگی های یک برنامه نویس
Share with your friend now:
tgoop.com/lython/66