Hoe kan ik implementeren __add__ methode in bovenliggende klasse?

stemmen
0

Ik heb objectgeoriënteerd programmeren modellering voor geometrische vormen. Ik heb toe te voegen methode om in elke klasse als ik wil twee geometrische vormen optelt, maar ik heb in elk subklasse gedefinieerd. Hoe kan ik de uitvoering van de methode add in de bovenliggende klasse, zodat ik niet te definieerde voor elke subklassen?

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
De vraag is gesteld op 02/12/2019 om 23:54
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

Dit is een vreemde vraag, omdat het niet echt zin om twee cirkels toe te voegen en het resultaat te zijn van een nieuwe cirkel met de som van de stralen. Je hebt ook vreemd gedrag voor het toevoegen van een int, want je bent het veranderen van de status van het object in plaats van een nieuwe te maken, zoals u dat doet bij het toevoegen van een object.

Maar er is in feite een manier om dit te doen met slechts een methode in de bovenliggende klasse, met behulp van enkele Python-specifieke kenmerken:

  • cls = self.__class__is de klasse van het huidige object, die kan worden gebruikt om een nieuw object van dezelfde klasse te maken, en test of otheris het juiste type.
  • d = self.__dict__ is een woordenboek van de kenmerken van het object.
  • Het **{ ... }uitpakken operator maakt het aanroepen van de clsaannemer met behulp van een woordenboek begrip voor de argumenten te berekenen.
  • Ik heb ook geschreven een generieke __repr__, die de toestand van het object toont, voor het eenvoudig testen van voorbeelden in de REPL.

Hier is een voorbeeld:

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

Voorbeelden:

>>> 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)

Merk op dat ik het gedrag heeft gewijzigd om altijd een nieuw object terug te keren, in plaats van het muteren van de bestaande.

antwoordde op 03/12/2019 om 00:08
bron van user

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