Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Entendendo melhor a orientação a objetos. Como utilizar a composição de objetos?

Sejam a classe Point() e a classe Circle() definidas abaixo:

class Point():
        def __init__(self,x,y):
            self._x = x
            self._y = y

        @property
        def x(self):
            return self._x

        @x.setter
        def x(self,x):
            self._x = x

        @property
        def y(self):
            return self._y

        @y.setter
        def y(self,y):
            self._y = y


        def __repr__(self):
            return f"{self._x}, {self._y}"

        def move(self,x,y):
            self._x = x
            self._y = y
            return self._x,self._y



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

        def move(self,x,y):
            Point.move(self,x,y)

        def __repr__(self):


          return f"radius = {self._radius}, \nx = {self.x},\ny = {self.y}"



point1 = Point(12,3)
print(point1)
point1.y = 0
print(point1)

point1.move(55,7)
print(point1)

circle1 = Circle(4,1,1)
print(circle1)
circle1.move(2,2)
print(circle1)

Tentei criar o método move(x,y) do Círculo, chamando o move(x,y) do Ponto mas sem usar a herança. Inicialmente o círculo foi criado em

circle1 = Circle(4,1,1)

No entanto, ao usar circle1.move(2,2) o círculo continua em (1,1). O que está errado?

6 respostas

Olá Edson,

Dentro da classe Point() você utiliza as variáveis _x e _y e na classe Circle() as variáveis são chamadas apenas de x e y.

Apenas para efeito de teste e não modificar as variáveis em toda a classe crieu um segundo método move() dentro da classe Point():

     def move2(self,x,y):
        self.x = x
        self.y = y
        return self.x,self.y

E chamei esse método dentro da classe Circle():

  def move(self,x,y):
        Point.move2(self,x,y)

Verifica se dá certo aí pra você!

@André Alexandre Stella:

Boa noite! Não entendi!

@André Alexandre Stella:

Não entendi porque não funciona apenas como o move só com move2

Na verdade o move2 fiz apenas para teste, ele vai funcionar também com o move mas para isso você vai ter que alterar os nomes das variáveis _x e _y na classe Point() para x e y, sem _(underscore). Testa aí e nos fale se deu certo.

@André Alexandre Stella

AH sim

MAs o problema pedia para usar _x e _y: Neste caso, só criando o move2? Não são a mesma varável? _x não seria para simular private?

Fiquei confuso!

solução!

Você pode usar _x e _y também sem problemas, desde que na classe Circle() sejam elas a serem usadas também. O importante para isso funcionar é que nas duas classes os nomes das variáveis devem ser iguais. Olha abaixo a modificação que fiz na classe Circle() sem precisar mexer na classe Point():

class Circle():
    def __init__(self,radius,x,y):
        self._radius = radius
        self._x = x # modifiquei aqui
        self._y = y # modifiquei aqui

    def move(self,x,y):
        Point.move(self,x,y)

    def __repr__(self):
        return f"radius = {self._radius}, \nx = {self._x},\ny = {self._y}" # modifiquei aqui

Vê se faz sentido pra você agora!