简体   繁体   English

无法从子类调用父类方法

[英]Having trouble calling the parent class method from child class

I've started trying to learn Python after working with Java for the past year and decided to work on a couple class projects I've done and to write them in Python. 在使用Java一年之后,我开始尝试学习Python,并决定从事一些我已经完成的班级项目,并用Python编写它们。 I am getting an AttributeError at line 102, stating my super object has no attribute 'area'. 我在第102行收到AttributeError,表示我的超级对象没有属性“ area”。

I've looked through different posts of how it's done, and I can't seem to figure out why this isn't working correctly for me after following other solutions. 我浏览了不同的帖子,了解如何完成此操作,而在遵循其他解决方案之后,我似乎无法弄清楚为什么这对我来说无法正常工作。

It's a simple program that takes in input from the user, parses it, then depending on the shape type, will call the methods of the appropriate object type, then calculates and prints it out. 这是一个简单的程序,可以接收用户的输入,进行解析,然后根据形状类型,调用适当对象类型的方法,然后进行计算并打印出来。 For example, an input would be "R 3/4 5-7", supposed to weigh 8.37, or "P 1/4 5-6 2-3", supposed to weigh 126.07. 例如,输入应为“ 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

I think replacing the super and instead using staticmethod is a better choice. 我认为替换super而不是使用staticmethod是更好的选择。 See here: 看这里:

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

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM