Wie kann ich __add__ Methode in übergeordneter Klasse implementieren?

stimmen
0

Ich habe die objektorientierte Programmierung Modellierung für geometrische Formen. Ich habe hinzufügen Methode in jeder Klasse , wenn ich zwei geometrische Formen hinzufügen will , aber ich habe in jeder Unterklasse definiert. Wie kann ich die implementieren add - Methode in der übergeordneten Klasse, so dass ich es nicht für alle Unterklassen definiert?

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
Veröffentlicht am 02/12/2019 um 23:54
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Das ist eine seltsame Frage, weil sie nicht wirklich sinnvoll , zwei Kreise hinzugefügt und haben das Ergebnis mit der Summe der Radien ein neuer Kreis sein. Sie haben auch eine merkwürdiges Verhalten für das Hinzufügen von mit ein , intweil Sie den Zustand des Objekts verändern , anstatt einen neuen zu erstellen, wie Sie tun , wenn Sie ein Objekt hinzufügen.

Aber es gibt in der Tat eine Möglichkeit, dies zu tun, mit nur einer Methode in der übergeordneten Klasse, einige Pythons-spezifische Funktionen verwenden:

  • cls = self.__class__ist die Klasse des aktuellen Objekts, das ein neues Objekt der gleichen Klasse und Test zu erstellen , wenn verwendet werden kann , otherdie richtige Art ist.
  • d = self.__dict__ ist ein Wörterbuch des Attributs des Objekts.
  • Der **{ ... }Auspacken Bediener erlaubt den Aufruf der clsKonstruktor ein Wörterbuch Verständnis über die Argumente zu berechnen.
  • Ich habe auch ein generische geschrieben , __repr__das den Zustand des Objekts zeigt, zum bequemen Beispiel in der REPL testen.

Hier ein Beispiel:

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

Beispiele:

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

Beachten Sie, dass ich das Verhalten geändert haben, um immer ein neues Objekt zurück, anstatt die vorhandenen mutiert.

Beantwortet am 03/12/2019 um 00:08
quelle vom benutzer

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