Hogyan tudom végrehajtani __add__ módszer szülő osztályban?

szavazat
0

Van objektumorientált programozási modellezés geometriai formák. Van hozzá eljárás egyes osztályok, ha azt akarom, hogy összeadja a két geometriai formák, de már meghatározott minden egyes alosztálya. Hogyan tudom végrehajtani a kiegészítő eljárás a szülő osztályban, úgyhogy én nem az határozta meg minden alosztályok?

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
A kérdést 02/12/2019 23:54
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
1

Ez egy furcsa kérdés, mert nem igazán van értelme, hogy két kört, és az eredmény egy új kör az összeget a sugarak. Arra is van furcsa viselkedését hozzátéve egy int, mert változnak az állapota az objektum létrehozása helyett egy újat, mint te, ha hozzá egy tárgy.

De valójában egy módja annak, hogy ezt csak egy módja a szülő osztályban, segítségével néhány Python-specifikus funkciók:

  • cls = self.__class__az osztály az aktuális objektum, amelyet fel lehet használni, hogy hozzon létre egy új objektumot az azonos osztályú és a teszt, ha othera megfelelő típust.
  • d = self.__dict__ Egy szótár a objektum tulajdonságait.
  • A **{ ... }kicsomagolás kezelő lehetővé teszi hívja a clskivitelező egy szótár megértés kiszámítására az érveket.
  • Én is írt egy általános __repr__, ami azt mutatja, az állam a tárgy, amellyel kényelmesen tesztelés példák a REPL.

Íme egy példa:

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

Példák:

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

Vegyük észre, hogy már megváltozott a viselkedése, hogy mindig vissza egy új objektumot, ahelyett, hogy mutáló a meglévőt.

Válaszolt 03/12/2019 00:08
a forrás felhasználó

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