پیتزاسازی های خوشمزه با @classmethod در پایتون
اگر در دنیای واقعی با پیتزا آشنا شده اید، این را می دانید تنوع خوشمزه زیادی وجود دارد:Pizza([‘mozzarella’, ‘tomatoes’, ‘ham’, ‘mushrooms’]) Pizza([‘mozzarella’] * 4)ایتالیایی ها طبقه بندی پیتزا خود را قرن ها پیش کشف کردند و همینطور این انواع پیتزای خوشمزه همه نام های خاص خود را دارند. ما خوب عمل می کنیم تا از آن بهره ببریم و به کاربران کلاس پیتزای خودمان بهتر دهیم رابط برای ایجاد اشیاء پیتزای مورد علاقه آنها. یک راه خوب و تمیز برای انجام این کار استفاده از متدهای کلاس به عنوان کارخانه است توابع 7 برای انواع مختلف پیتزا که می توانیم ایجاد کنیم:class Pizza: Pizza([‘mozzarella’, ‘tomatoes’]) def __init__(self, ingredients): def __repr__(self): self.ingredients = ingredients return f’Pizza({self.ingredients!r})’def margherita(cls): @classmethod return cls([‘mozzarella’, ‘tomatoes’]) def prosciutto(cls): @classmethod return cls([‘mozzarella’, ‘tomatoes’, ‘ham’])توجه داشته باشید که چگونه از آرگومان cls در margherita و استفاده می کنم به طور مستقیم. روش های کارخانه پروشوتو به جای فراخوانی سازنده پیتزا این ترفندی است که می توانید از آن برای پیروی از خودت تکرار نکن (DRY)۸ استفاده کنی اصل اگر زمانی تصمیم به تغییر نام این کلاس بگیریم، این کار را نخواهیم کرد باید به یاد داشته باشید که نام سازنده را در تمام کارخانه به روز کنید حالا با این روش های کارخانه ای چه کنیم؟ بیایید آنها را امتحان کنیم: >>> Pizza.margherita() کارکرد. Pizza([‘mozzarella’, ‘tomatoes’]) Pizza([‘mozzarella’, ‘tomatoes’, ‘ham’])همانطور که می بینید، ما می توانیم از توابع کارخانه برای ایجاد پیتزای جدید استفاده کنیم اشیایی که دقیقاً همانطور که ما می خواهیم پیکربندی شده اند. همه آنها استفاده می کنند همان سازنده init به صورت داخلی و به سادگی یک میانبر ارائه می دهد برای به خاطر سپردن همه اجزای مختلف >>> Pizza.prosciutto() راه دیگر برای نگاه کردن به این استفاده از متدهای کلاس این است که متوجه شوید که آنها به شما امکان می دهد سازنده های جایگزین برای کلاس های خود تعریف کنید. پایتون فقط یک متد init را در هر کلاس اجازه می دهد. استفاده از روش کلاس امکان اضافه کردن سازنده های جایگزین را به میزان لازم فراهم می کند. این میتواند رابط کلاسهای شما را مستندسازی کند زمان استفاده از روش های استاتیک (تا حد معینی) و استفاده از آنها را ساده کنید. به شما بگویم – من فقط قیاس پیتزا را نازک تر می کنم و در اینجا ارائه یک مثال خوب کمی دشوارتر است، اما این چیزی است که من به آن رسیدم:import math نازک تر… (آما!) class Pizza: self.radius = radius self.ingredients = ingredients def __repr__(self): def __init__(self, radius, ingredients): f'{self.ingredients!r})’) return (f’Pizza({self.radius!r}, ‘ def area(self): @staticmethod def circle_area(r): return self.circle_area(self.radius) return r ** 2 * math.pi حالا من اینجا چه چیزی را تغییر دادم؟ ابتدا سازنده و را اصلاح کردم من همچنین یک روش نمونه area() اضافه کردم که مساحت پیتزا را محاسبه و دوباره برگرداند. این نیز کاندیدای خوبی برای یک خواهد بود @property—اما هی، این فقط یک نمونه اسباب بازی است.repr برای پذیرش آرگومان شعاع اضافی.
قوانین ارسال دیدگاه در سایت