💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ آرین هادی
نحوه استفاده abstract method در فایل‌های دیگر
محسن موحد حل شده توسط محسن موحد

با عرض درود و خسته نباشید, من یک سوالیی که برام پیش اومدع این هستش که در این ویدیو چطور در فایل estate بدون وجود ABC میشع از abstract method استفاده کرد؟ من با اینکه از کلاس Base ارث بری کردم اما باز نمیتونم از abstract method استفاده کنم. 


from abc import ABC
class Base(ABC):
    _id = 0
    object_list = list()
    def __init__ (self, *args, **kwargs):
        self.id = self.generate_id()
        self.store(self)
        super().__init__(*args, **kwargs)
    @classmethod
    def generate_id(cls):
        cls._id += 1
        return cls._id
    @classmethod
    def store(cls, obj):
        cls.object_list.append(obj)
***********************************************************
from user import User
class Estate(Base):
    def __init__(self, user, area, built_year, num_rooms, region, address,*args, **kwargs):
        self.seller = user
        self.area = area
        self.built_year = built_year
        self.num_rooms = num_rooms
        self.region = region
        self.address = address
        super().__init__(*args, **kwargs)
    @abstractmethod
    def show_desription(self):
        pass
class Apartment(Estate):
    def __init__(self, has_elavator, has_parking, floor, *args, **kwargs):
        self.has_elavator = has_elavator
        self.has_parking = has_parking
        self.floor = floor
        super().__init__(*args, **kwargs)
class House(Estate):
    def __init__(self, has_garden, number_of_floors,*args, **kwargs):
        self.has_garden = has_garden
        self.number_of_floors = number_of_floors
        super().__init__(*args, **kwargs)
class Store(Estate):
    pass


 

سلام،

ببینید، استفاده از ABC و abstractmethod توی پایتون به این خاطر هست که مطمئن بشی کلاس‌های فرزندت متدهای انتزاعی رو پیاده‌سازی میکنن. اگه از ABC و abstractmethod استفاده کنی و کلاس فرزندت اون متدهای انتزاعی رو پیاده‌سازی نکنه، کدت به خطا میخوره. حالا شما توو کدتون اومدید ABC رو به Base دادید و Base رو به Estate بنابراین ازینجا به بعد تمامی کلاس‌هایی که از Estate ارث‌بری میکنن باید متد ابسترکت show_desription رو پیاده سازی کنن که شما این کارو نکردید. اگر ABC رو ارث‌بری نکنید و متد abstract رو پیاده‌سازی نکنید، خطایی رخ نمیده. کد درست به شکل زیر است:

from abc import ABC, abstractmethod
class Base():
    _id = 0
    object_list = list()
    def __init__ (self, *args, **kwargs):
        self.id = self.generate_id()
        self.store(self)
        super().__init__(*args, **kwargs)
    @classmethod
    def generate_id(cls):
        cls._id += 1
        return cls._id
    @classmethod
    def store(cls, obj):
        cls.object_list.append(obj)
class Estate(Base, ABC):
    def __init__(self, user, area, built_year, num_rooms, region, address, *args, **kwargs):
        self.seller = user
        self.area = area
        self.built_year = built_year
        self.num_rooms = num_rooms
        self.region = region
        self.address = address
        super().__init__(*args, **kwargs)
    @abstractmethod
    def show_description(self):
        pass
class Apartment(Estate):
    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):
        return f"Apartment with {self.num_rooms} rooms, located at {self.address}."
class House(Estate):
    def __init__(self, has_garden, number_of_floors, *args, **kwargs):
        self.has_garden = has_garden
        self.number_of_floors = number_of_floors
        super().__init__(*args, **kwargs)
    def show_description(self):
        return f"House with {self.num_rooms} rooms and a garden, located at {self.address}."
class Store(Estate):
    def show_description(self):
        return f"Store located at {self.address}."

 

بهترین پاسخ
محسن موحد ۲۳ تیر ۱۴۰۳، ۰۹:۰۶