سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ گیسو
نگرفتن خروجی صحیح
جامعه پایتون (وب) ایجاد شده در ۲۷ اسفند ۱۴۰۳

سلام وقت بخیر تابع search براساس فیلد هایی در تعاریف هستد یعنی همان محله و قیمت ومتراژ وتعداد خواب برا یمن خروجی نمایش نمیدهد و فقط براساس floorخروجی را صحیح به من نمایش میدهد ممنون میشم چک کنید 

قسمتی از کد‌ها به صورت زیر است :

class BaseClass(ABC):
    _id = 0
    objects_list = None
    manager=None

    def __init__(self, *args, **kwargs):
        self.id = self.generate_id()
        self.store(self)
        self.set_manager()
        super().__init__(*args, **kwargs)

    @classmethod
    def generate_id(cls):
        cls._id += 1
        return cls._id
    @classmethod
    def set_manager(cls):
        if cls.manager is None:
            cls.manager = Manager(cls)
    @classmethod
    def store(cls, obj):
        if cls.objects_list is None:
            cls.objects_list=list()
        cls.objects_list.append(obj)

class Apartement(EstateAbstract):
    def __init__(self, has_elevator, has_parking, floor, *args, **kwargs):
        self.has_elevator = has_elevator
        self.has_parking = has_parking
        self.floor = floor
        super().__init__(*args, *kwargs)
    def show_description(self):
        print(f"Apartement: {self.id}\t area:{self.has_parking}")

class Rent(ABC):
    def __init__(self, initial_price, monthly_price, convertable, discountable, *args, **kwargs):
        self.initial_price = initial_price
        self.monthly_price = monthly_price
        self.convertable = convertable
        self.discountable = discountable
        super().__init__(*args, **kwargs)
    def show_price(self):
        print(f"monthly_price:{self.monthly_price}\t discountable:{self.discountable}")
class ApartementRent(BaseClass,Rent,Apartement):
    def show_detail(self):
        self.show_description()
        self.show_price()
class Manager:
    def __init__(self,_class=None):
        self._class=_class
    def __str__(self):
        return f"{self._class}"

    def search(self,**kwargs):
        """
        :param kwargs: a=2,c=12,name='ali'
        :return: obj(a=2,c=12,name='ali'
        """
        result=list()
        for key,value in kwargs.items():
            for obj in self._class.objects_list:
                if hasattr(obj,key) and getattr(obj,key)==value:
                    result.append(obj)
        return result
    def get(self,**kwargs):
        for key,value in kwargs.items():
            for obj in self._class.objects_list:
                if hasattr(obj,key) and getattr(obj,key)==value:
                    return obj
reg1 = Region(name='R1')
reg2=Region(name='R2')
apt1 = Apartement(has_elevator=True, has_parking=True, floor=2,user=User.objects_list[0], area=80, rooms_count=2,
                  built_year=1383,region=reg1, address="some text....")

apartement_rent=ApartementRent(has_elevator=True, has_parking=True, floor=2,user=User.objects_list[3], area=20, rooms_count=3,
                                  built_year=1354,region=reg1, address="some text....",initial_price=1200000, monthly_price=411000
                               , convertable=False, discountable=False)

search_result=ApartementRent.manager.search(floor=2)
print("Search result:",search_result)


print(ApartementRent.manager.get(floor=2))

سلام،

مشکل کدت اینه که تابع search فقط بر اساس یک شرط کار میکنه و بقیه فیلدها رو درست فیلتر نمیکنه. من یک تکه کد آماده کردم که همه شرط‌ها رو با هم چک میکنه. اینجوری هر چیزی مثل محله، قیمت، متراژ و تعداد خواب رو که بخوای، دقیق برات پیدا میکنه.

class Manager:
    def __init__(self, _class=None):
        self._class = _class
    def search(self, **kwargs):
        result = []
        for obj in self._class.objects_list:
            all_match = True
            for key, value in kwargs.items():
                if not (hasattr(obj, key) and getattr(obj, key) == value):
                    all_match = False
                    break
            if all_match:
                result.append(obj)
        return result

 

کد کامل بهمراه تست:

# تعریف کلاس‌های مورد نیاز (به صورت خلاصه)
class BaseClass:
    _id = 0
    objects_list = []
    manager = None
    def __init__(self, *args, **kwargs):
        self.id = self.generate_id()
        self.store(self)
        self.set_manager()
    @classmethod
    def generate_id(cls):
        cls._id += 1
        return cls._id
    @classmethod
    def store(cls, obj):
        cls.objects_list.append(obj)
    @classmethod
    def set_manager(cls):
        if cls.manager is None:
            cls.manager = Manager(cls)
class ApartementRent(BaseClass):
    def __init__(self, floor, area, rooms_count, monthly_price, *args, **kwargs):
        self.floor = floor
        self.area = area
        self.rooms_count = rooms_count
        self.monthly_price = monthly_price
        super().__init__(*args, **kwargs)
    def show_detail(self):
        print(f"ID: {self.id}, Floor: {self.floor}, Area: {self.area}, Rooms: {self.rooms_count}, Price: {self.monthly_price}")
class Manager:
    def __init__(self, _class=None):
        self._class = _class
    def search(self, **kwargs):
        result = []
        for obj in self._class.objects_list:
            all_match = True
            for key, value in kwargs.items():
                if not (hasattr(obj, key) and getattr(obj, key) == value):
                    all_match = False
                    break
            if all_match:
                result.append(obj)
        return result
# اضافه کردن چند نمونه آپارتمان
apt1 = ApartementRent(floor=2, area=80, rooms_count=2, monthly_price=300000)
apt2 = ApartementRent(floor=2, area=20, rooms_count=3, monthly_price=411000)
apt3 = ApartementRent(floor=3, area=80, rooms_count=2, monthly_price=350000)
# تست جستجو
print("جستجو با floor=2:")
search_result1 = ApartementRent.manager.search(floor=2)
for apt in search_result1:
    apt.show_detail()
print("\nجستجو با floor=2 و area=80:")
search_result2 = ApartementRent.manager.search(floor=2, area=80)
for apt in search_result2:
    apt.show_detail()
print("\nجستجو با floor=2 و rooms_count=3:")
search_result3 = ApartementRent.manager.search(floor=2, rooms_count=3)
for apt in search_result3:
    apt.show_detail()
محسن موحد ۲۹ اسفند ۱۴۰۳، ۱۹:۵۵