Ahmad Qassym Ответов: 1

Как устранить эту проблему


import math

class TwoDObject:
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y
    def area(self):
        return 0
    def move(self,xchange=0,ychange=0):
        self.x = self.x + xchange
        self.y = self.y + ychange

class Circle(TwoDObject):
    def __init__(self,radius:float=1,**kwargs):
        self.radius = radius
        super().__init__(**kwargs)
    def area(self):
        return(self.radius*self.radius*math.pi)
    def size_change(self,percent:float):
        self.radius = self.radius * (percent/100)

class Sector(Circle):
    def __init__(self,angle:float=180,**kwargs):
        self.angle = angle
        super().__init__(**kwargs)        
    def area(self):
        return super().area() * self.angle/360


class Rectangle(TwoDObject):
    def __init__(self,height:float=1,width:float=1,**kwargs):
        self.width = width
        self.height = height
        super().__init__(**kwargs)
    def area(self):
        return self.width * self.height
    def size_change(self,percent:float):
        self.width = self.width * (percent/100)
        self.height = self.height * (percent/100)




if __name__ == "__main__":
    c  =  Circle(5,11,22)
    r = Rectangle(100,100,20,20)
    print(c.x,c.y)


Что я уже пробовал:

the code throws an error that there are more arguments for Circle objject,but actually the circle class take 3 parameters but in fact exactly 3 arguments to the c objcect are given 

ошибка типа :
Traceback (most recent call last):
  File "2tsal.py", line 46, in <module>
    c  =  Circle(5,11,22)
TypeError: __init__() takes from 1 to 2 positional arguments but 4 were given

Luc Pattyn

Привет,

Я не говорю на Python, но мой Google foo в порядке.
Мне удалось найти этот пример что очень похоже на ваш код.

Есть некоторые различия в обработке параметров: у них нет никаких **kwargs (я не понимаю, что это делает в вашем коде), а __init__ производных классов вызывает super().__init__ (...), что кажется вполне логичным.

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

Ahmad Qassym

без **kwargs вам придется изменять подклассы всякий раз, когда вы добавляете параметры в свой суперкласс.
но с **kwargs каждый подкласс не должен заботиться о унаследованных атрибутах ,скорее он заботится только о своих собственных атрибутах.

1 Ответов

Рейтинг:
7

Richard MacCutchan

Вы объявляете свой конструктор круга как

def __init__(self,angle:float=180,**kwargs):

но затем попробуйте передать значения вместо пар ключевых слов. Вам нужно позвонить ему по телефону:
Circle(5,x=11,y=22)

И то же самое с вашим прямоугольником. Хотя с таким небольшим количеством параметров это вряд ли стоит накладных расходов.

Видеть 4. Дополнительные инструменты потока управления — документация Python 3.7.8[^].


Maciej Los

5ed!

Richard MacCutchan

Еще раз спасибо, Мацей. Умение читать документацию приносит мне все больше и больше очков. :)

Luc Pattyn

отличная ссылка
+5

Richard MacCutchan

Спасибо, Люк. Если бы только все новички пользовались официальными онлайн-учебниками, а не пытались изучать язык через YouTube.

Luc Pattyn

Что вы подразумеваете под "YouTube"?
О, это подростковая версия "ТИК-тока"?

На самом деле клип с попугаем хорошо поместился бы на странице, на которую вы ссылались...