Come posso implementare __add__ metodo nella classe genitrice?

voti
0

Ho modellazione programmazione orientata agli oggetti per le forme geometriche. Ho aggiungere metodo in ogni classi se voglio aggiungere due forme geometriche, ma ho definito in ogni sottoclasse. Come posso implementare il metodo add nella classe padre, in modo che io non lo faccio per definire per ogni sottoclassi?

import numpy as np

class Shape(object):


    def __repr__(self):
        return type(self).__name__

    def __str__(self):
        return type(self).__name__

class Circle(Shape):
    

    
       # constructor

    def __init__(self, radius):
        self.radius = radius
    def __add__(self, other):
        if type(other) == int:
            self.radius = self.radius + other            
        else: 
            newRadius = self.radius + other.radius
            return Circle(newRadius)
    def __radd__(self, other):
        return self.__add__(other)
    def area(self):
        return np.pi * self.radius**2

class Rectangle(Shape):
    # constructor

    def __init__(self, width,height):
        self.width , self.height = width, height
    def __add__(self, other):
        if type(other) == int:
            self.width = self.width + other  
            self.height = self.height + other  
        else: 
            newWidth = self.width + other.width
            newHeight = self.Height + other.Height
            return Rectangle(newWidth,newHeight)
    def __radd__(self, other):
        return self.__add__(other)


    def area(self):
        
        Function to compute the area of triangle.
        
        return self.width * self.height
È pubblicato 02/12/2019 alle 23:54
fonte dall'utente
In altre lingue...                            


1 risposte

voti
1

Questa è una domanda strana, perché in realtà non ha senso aggiungere due cerchi ed avere il risultato sarà un nuovo cerchio con la somma dei raggi. Hai anche un comportamento strano per l'aggiunta di un intperché si sta modificando lo stato dell'oggetto, invece di crearne uno nuovo, come si fa quando si aggiunge un oggetto.

Ma v'è in realtà un modo per fare questo con un solo metodo nella classe genitore, utilizzando alcune funzioni specifiche di Python:

  • cls = self.__class__è la classe dell'oggetto corrente, che può essere usato per creare un nuovo oggetto della stessa classe, e verificare se otherè il tipo giusto.
  • d = self.__dict__ è un dizionario di attributi dell'oggetto.
  • L' **{ ... }operatore di estrazione, permette di chiamare il clscostruttore con la comprensione dizionario per calcolare gli argomenti.
  • Ho anche scritto un generico __repr__che mostra lo stato dell'oggetto, per testare comodamente esempi nel REPL.

Ecco un esempio:

class Shape:
    def __add__(self, other):
        cls = self.__class__
        d = self.__dict__
        if isinstance(other, int):
            return cls(**{ k: v + other for k, v in d.items() })
        elif isinstance(other, cls):
            return cls(**{ k: v + other.__dict__[k] for k, v in d.items() })
        else:
            raise TypeError()

    def __radd__(self, other):
        return self.__add__(other)

    def __repr__(self):
        d = self.__dict__
        return '{0}({1})'.format(
            self.__class__.__name__,
            ', '.join('{0}={1!r}'.format(k, v) for k, v in d.items())
        )

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

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

Esempi:

>>> Circle(4) + Circle(5)
Circle(radius=9)
>>> Circle(6) + 2
Circle(radius=8)
>>> 3 + Circle(2)
Circle(radius=5)
>>> Rectangle(2, 3) + Rectangle(4, 5)
Rectangle(width=6, height=8)
>>> Rectangle(2, 3) + 1
Rectangle(width=3, height=4)
>>> 5 + Rectangle(2, 3)
Rectangle(width=7, height=8)

Si noti che ho cambiato il comportamento di ritornare sempre un nuovo oggetto, invece di mutare quella esistente.

Risposto il 03/12/2019 a 00:08
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more