Comment puis-je mettre en œuvre __add__ méthode dans la classe parent?

voix
0

J'ai la modélisation de la programmation orientée objet pour les formes géométriques. J'ajouter méthode dans chaque classe si je veux ajouter deux formes géométriques , mais je l' ai défini dans chaque sous - classe. Comment puis - je mettre en œuvre la méthode d'ajout dans la classe parente, de sorte que je le fais pas défini pour chaque sous - classes?

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
Créé 02/12/2019 à 23:54
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

C'est une question étrange, car il ne fait pas vraiment de sens pour ajouter deux cercles et avoir le résultat soit un nouveau cercle avec la somme des rayons. Vous avez également un comportement étrange pour ajouter avec un intparce que vous changez l'état de l'objet au lieu de créer une nouvelle, comme vous le faites lors de l' ajout d' un objet.

Mais il est en fait une façon de le faire avec une seule méthode dans la classe parente, en utilisant certaines fonctionnalités spécifiques Python:

  • cls = self.__class__est la classe de l'objet courant, qui peut être utilisé pour créer un nouvel objet de la même classe, et tester si otherest le bon type.
  • d = self.__dict__ est un dictionnaire des attributs de l'objet.
  • L' **{ ... }opérateur déballage permet d' appeler le clsconstructeur en utilisant une compréhension dictionnaire pour calculer les arguments.
  • J'ai aussi écrit un générique __repr__qui montre l'état de l'objet, pour tester commodément des exemples dans le REPL.

Voici un exemple:

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

Exemples:

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

Notez que j'ai changé le comportement pour revenir toujours un nouvel objet, au lieu de muter l'existant.

Créé 03/12/2019 à 00:08
source utilisateur

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