Как исправить эту проблему наследования с Python? - PullRequest
0 голосов
/ 03 октября 2019

В следующих скриптах, написанных на Python, я хотел вычислить площади круга, квадрата и прямоугольника. Из которых я хотел реализовать наследование от square.py к rectangle.py. Однако моя реализация наследования не удалась, и мне нужна помощь, чтобы решить эту проблему.

Когда я попытался вычислить площадь прямоугольника, я получил следующее сообщение об ошибке для записи.

Traceback (most recent call last):
  File "script.py", line 28, in <module>
    print(rectangle.sqArea())
  File "/home/yosuke/Dropbox/Coding_dir/Python/Originals/OOP/Mathmatics/testdir2/rectangle.py", line 8, in sqArea
    return self.length * self.height
AttributeError: 'Rectangle' object has no attribute 'length'

script.py

from circle import Circle
from square import Square
from rectangle import Rectangle

category = {1:"Shapes", 2:"DST"}
    for k,v in category.items():
    print(k, v)
catNum = int(input("Type a category by number>> "))
    if catNum == 1:
        print("You chose shapes")
        shapeDict = {1:"Circle", 2:"Square"}
    for k,v in shapeDict.items():
        print(k, v)
    shapeNum = int(input("Select a shape by number>> "))
    if shapeNum == 1:
        radius = int(input("type a number>> "))
        circle1 = Circle(radius)
        print(circle1.cirArea())

    if shapeNum == 2:
        length = int(input("Type the length>> "))
        square = Square(length)
        print(square.sqArea())

        print("Let's try rectangle too")
        height = int(input("Type the height>> "))
        rectangle = Rectangle(height)
        print(rectangle.sqArea())


    if catNum == 2:
        print("Not yet finished!")

circle.py

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def cirArea(self):
        return self.radius * self.radius * 3.14

square.py

class Square:
    def __init__(self, length):
        self.length = length

    def sqArea(self):
        return self.length * self.length

rectangle.py

from square import Square

class Rectangle(Square):
    def __init__(self, height):
        self.height = height

    def sqArea(self):
        return self.length * self.height

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

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

Примерно так может работать в Rectangle:

def __init__(self, length, height):
    super().__init__(length)
    self.height = height

Но ваши классы странные. Прямоугольник - это не квадрат, квадрат - это прямоугольник. Так что, если что, наследство должно работать в другом направлении.

Но я думаю, вы столкнетесь с проблемами довольно быстро. Оказалось, что объектно-ориентированное программирование не слишком хорошо моделирует подобные вещи, в действительности между разными формами не так много общего.

0 голосов
/ 03 октября 2019

Вы забыли назвать __init__ суперкласса.

class Rectangle(Square):
    def __init__(self, height):
        super().__init__(height)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...