سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ Arshia_Am
ذخیره شدن آبجکت‌های کلاس‌های مختلف در objects_list
محسن موحد حل شده توسط محسن موحد

تو کد پایین که طبق گفته‌های استاد هست آیدی‌ها برای هر کلاس فرزند یونیکن ولی همه‌ی آبجکتای ساخته شده از همه‌ی کلاسا تو یه objects_list ذخیره میشن و این باعث میشه نشه آبجکت‌های ذخیره شده رو دسته بندی کرد.

تنها راهکار جایگزینی که تونستم براش پیدا کنم استفاده از property , abstractmethod بود که باعث شه ما برای هر کلاس فرزندی که می‌نویسیم مجبور به نوشتن objects_list مجزا برای اونها بشیم که باعث خطوط تکراری میشن. 

 

class Baseclass:
    objects_list = list()
    _id = 0
    def __init__(self, *args, **kwargs):
        self.id = self.id_creator()
        self.store(self)
        super().__init__(*args, **kwargs)
    @classmethod
    def store(cls, obj):
        cls.objects_list.append(obj)
    @classmethod
    def id_creator(cls):
        cls._id += 1
        return cls._id

سلام،

برای حل این مشکل، می‌تونیم برای هر کلاس فرزند یک لیست مجزا برای ذخیره‌سازی آبجکت‌ها ایجاد کنیم. این کار می‌تونه با استفاده از متد __init_subclass__ در کلاس پایه انجام بشه تا به طور خودکار برای هر کلاس فرزند، یک لیست جداگانه ایجاد بشه. این رویکرد بدون نیاز به تعریف مجدد objects_list در هر کلاس فرزند، لیست‌های مجزا رو مدیریت می‌کنه.

class Baseclass:
    _id = 0
    def __init__(self, *args, **kwargs):
        self.id = self.id_creator()
        self.store(self)
        super().__init__(*args, **kwargs)
    @classmethod
    def store(cls, obj):
        cls.objects_list.append(obj)
    @classmethod
    def id_creator(cls):
        cls._id += 1
        return cls._id
    @classmethod
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.objects_list = []
# subclasses
class Child1(Baseclass):
    pass
class Child2(Baseclass):
    pass
# create objects
obj1 = Child1()
obj2 = Child1()
obj3 = Child2()
print(Child1.objects_list)  # [<__main__.Child1 object at ...>, <__main__.Child1 object at ...>]
print(Child2.objects_list)  # [<__main__.Child2 object at ...>]
بهترین پاسخ
محسن موحد ۱۲ شهریور ۱۴۰۳، ۱۷:۳۸

خیلی عالی بود ممنون

Arshia_Am ۱۲ شهریور ۱۴۰۳، ۲۱:۲۳