Получение AttributeError в коде Python (при наследовании от родительского класса) - Задание 30 объектно-ориентированного программирования (INFYTQ) - PullRequest
0 голосов
/ 05 июля 2019

Я практикую некоторые объектно-ориентированные назначения, и в этом я хочу наследовать атрибут private родительского класса. Я хочу проверить это с некоторыми условиями. Есть ли способ извлечь значение атрибута private через наследование. Я использовал метод получения, но все еще получаю ошибку.

Я следую этой диаграмме классов: class diagram

class Pizzaservice:
    counter = 100
    def __init__(self, customer, pizza_type, additional_topping):
        self.__service_id = None
        self.__customer = customer
        self.__pizza_type = pizza_type
        self.__additional_topping = additional_topping  #boolean (T=req)
        self.pizza_cost = None
    def validate_pizza_type(self):
        if(self.get_pizza_type() == "Small" or self.get_pizza_type() == "Medium"):
            return True
        else:
            return False
    def calculate_pizza_cost(self):
        a = self.validate_pizza_type()
        b = self.__customer.validate_quantity()
        if(a == True and b == True):
            q = self.__customer.get_quantity()
            if(self.__pizza_type == "Small"):
                if(self.__additional_topping == True):
                    self.pizza_cost = (150 + 35) * q
                else:
                    self.pizza_cost = 150 * q
            elif(self.__pizza_type == "Medium"):
                if(self.__additional_topping == True):
                    self.pizza_cost = (200 + 50) * q
                else:
                    self.pizza_cost = 200 * q

            Pizzaservice.counter += 1
            self.__service_id = self.__pizza_type[0:1] + str(Pizzaservice.counter)
        else:
            self.pizza_cost = -1

    def get_service_id(self):
        return self.__service_id
    def get_pizza_type(self):
        return self.__pizza_type
    def get_customer(self):
        return self.__customer
    def get_additional_topping(self):
        return self.__additional_topping

class Doordelivery(Pizzaservice):
    def __init__(self, customer, pizza_type, additional_topping, distance_in_kms):
        self.__delivery_charge = None
        self.__distance_in_kms = distance_in_kms
    def validate_distance_in_kms(self):
        if(self.__distance_in_kms >=1 and self.__distance_in_kms <=10):
            return True
        else:
            return False
    def calculate_pizza_cost(self):
        d = self.validate_distance_in_kms()
        if(d == True):
            temp = super().calculate_pizza_cost()
            if(temp != -1):
                if(self.__distance_in_kms <= 5):
                    self.__delivery_charge = 5 * self.__distance_in_kms
                    self.pizza_cost = self.pizza_cost + self.__delivery_charge
                else:
                    self.__delivery_charge = 25 + (7 * (self.__distance_in_kms - 5))
                    self.pizza_cost = self.pizza_cost + self.__delivery_charge
            else:
                self.pizza_cost = -1
    def get_delivery_charge(self):
        return self.__delivery_charge
    def get_distance_in_kms(self):
        return self.__distance_in_kms

class Customer:
    def __init__(self, customer_name, quantity):
        self.__customer_name = customer_name
        self.__quantity = quantity
    def validate_quantity(self):
        if(self.__quantity >= 1 and self.__quantity <= 5):
            return True
        else:
            return False
    def get_customer_name(self):
        return self.__customer_name
    def get_quantity(self):
        return self.__quantity

c = Customer("Sanya", 2)
obj_1 = Pizzaservice(c, "Small", True)
obj_2 = Doordelivery(c, "Small", True, 2)
obj_1.calculate_pizza_cost()
obj_2.calculate_pizza_cost()

Я получаю эту ошибку:

Traceback (последний вызов был последним):
строка 89, в
obj_2.calculate_pizza_cost ()
строка 56, в Calculate_pizza_cost
temp = super (). Calculate_pizza_cost ()
строка 15, в Calculate_pizza_cost
a = self.validate_pizza_type ()
строка 10, в validate_pizza_type
if (self.get_pizza_type () == "Маленький" или self.get_pizza_type () == "Средний"):
строка 38, в get_pizza_type
вернуть себя .__ pizza_type
AttributeError: у объекта 'Doordelivery' нет атрибута'_Pizzaservice__pizza_type '

Разве я не понимаю часть наследования? Какую процедуру следует выполнить, чтобы исправить это?

1 Ответ

0 голосов
/ 05 июля 2019

Если я не ошибаюсь, поскольку вы определяете новый конструктор, отличный от родительского класса, вы переопределяете функцию __init__. Вот почему переменная не может быть найдена, потому что конструктор родительского класса не был вызван! Вам необходимо вызвать super().__init__(...), чтобы также инициализировать переменные, которые вы определили в родительском классе.

...