Возникли проблемы при вызове метода родительского класса из дочернего класса - PullRequest
0 голосов
/ 05 ноября 2018

Я начал пытаться изучать Python после работы с Java в течение прошлого года и решил поработать над парой проектов класса, которые я сделал, и написать их на Python. Я получаю AttributeError в строке 102, заявив, что мой суперобъект не имеет атрибута 'area'.

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

Это простая программа, которая принимает входные данные от пользователя, анализирует их, затем в зависимости от типа фигуры вызывает методы соответствующего типа объекта, а затем вычисляет и распечатывает его. Например, ввод будет "R 3/4 5-7", который должен весить 8,37, или "P 1/4 5-6 2-3", который должен весить 126,07.

import math

class Shipment:
    _weight = 0

    def weight(self):
        return self._weight

    def frac_in_feet(self, frac):
        thick_frac = frac.replace('/', "")
        print("number is: ", thick_frac)
        numerator = int(thick_frac[0])
        denominator = int(thick_frac[1])
        fraction_of_an_inch = numerator / denominator

        return self.in_feet(0, fraction_of_an_inch)

    def feet_and_inches_in_feet(self, feet_and_inches):
        a = feet_and_inches.replace('-', "")
        print("number is: ", a)
        feet = int(a[0])
        inches = int(a[1])

        return self.in_feet(feet, inches)

    def in_feet(self, feet, inches):
        inches /= 12
        print(feet + inches)
        return feet + inches

    def get_value_in_feet(self, str):
        i = str.find('/')
        j = str.find('-')

        if i == -1:
            value = self.feet_and_inches_in_feet(str)

        if j == -1:
            value = self.frac_in_feet(str)

        return value

    def add_item(self, quantity, description):
        desc_values = description.replace(" ", "")
        values = []
        shape_letter = desc_values[0]
        i = 1
        j = 4
        for r in range(int(len(desc_values) / 3)):
            print("r is: ", r)
            values.append(self.get_value_in_feet(desc_values[i:j]))

            i += 3
            j += 3

        if shape_letter == 'P':
            if len(values) != 3:
                raise ValueError("Plate needs three dimensions. ")

            shape = Plate(values[0], values[1], values[2])

        elif shape_letter == 'R':
           if len(values) != 2:
               raise ValueError("Rod needs two dimensions")

           shape = Rod(values[0], values[1])

        else:
            raise ValueError("Shape letter ", shape_letter, " not recognized.")

        self._weight += quantity * shape.weight()
        return shape





class SteelShape:
    _length = 0
    _weight = 0

    def length(self, length):
        _length = length

    def length(self):
        return self._length

    def weight(self, weight):
        self._weight = weight

    def weight(self):
        return self._weight

class CalcShape(SteelShape):
    _area = 0

    def area(self, area):
        self._area = area

    def weight(self):
        return self._area * self.length() * 489





class Rod(CalcShape):
    def __init__(self, diameter, length):
        radius = diameter / 2
        super(CalcShape, self).area(math.pi * radius**2)
        super(CalcShape, self).length





class Plate(CalcShape):
    def __init__(self, thick, width, length):
        super(CalcShape, self).area(thick * width)
        super(SteelShape, self).length(length)

values = []
shipment = Shipment()
shape = SteelShape()
line = input("Enter shape and dimensions: ")
shape = shipment.add_item(1, line)
if isinstance(shape, Plate):
    print("Plate weighs ", shape.weight())

elif isinstance(shape, Rod):
    print("Rod weighs ", shape.weight())


print("Total shipment weight: ", shipment.weight())
# R 3/4 5-7: supposed to weigh 8.37
# P 1/4 5-6 2-3: supposed to weigh 126.07

1 Ответ

0 голосов
/ 05 ноября 2018

Я думаю, что замена супер и использование статического метода - лучший выбор. Смотрите здесь:

https://stackoverflow.com/a/735978/10416716

Надеюсь, это поможет.

...