मैं कैसे माता पिता कक्षा में __add__ विधि लागू कर सकते हैं?

वोट
0

मैं ज्यामितीय आकार के लिए ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग मॉडलिंग की है। मैं जोड़ने के प्रत्येक वर्ग में विधि अगर मैं दो ज्यामितीय आकार को जोड़ने के लिए चाहते हैं, लेकिन मैं हर उपवर्ग में परिभाषित किया गया है। मैं कैसे लागू कर सकते हैं जोड़ने विधि माता पिता कक्षा में है, ताकि मैं हर उपवर्गों के लिए यह परिभाषित करने के लिए नहीं करते हैं?

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
02/12/2019 को 23:54
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
1

क्योंकि यह वास्तव में दो मंडलियों को शामिल करने मतलब नहीं है और परिणाम दायरों की राशि के साथ एक नया चक्र होना है यह एक अजीब सवाल है। तुम भी एक साथ जोड़ने के लिए अजीब व्यवहार है intक्योंकि आप वस्तु की स्थिति बदल रहे हैं के बजाय एक नया बनाने, जैसे आप जब एक वस्तु को जोड़ने है।

लेकिन माता-पिता कक्षा में सिर्फ एक विधि के साथ यह करने के लिए, कुछ अजगर विशिष्ट सुविधाओं का उपयोग कर एक तरह से वास्तव में है:

  • cls = self.__class__वर्तमान वस्तु है, जो एक ही कक्षा की एक नई वस्तु बनाने के लिए इस्तेमाल किया जा सकता का वर्ग, और परीक्षण करता है, तो है otherसही प्रकार है।
  • d = self.__dict__ वस्तु की विशेषताओं का एक शब्दकोश है।
  • **{ ... }खोल ऑपरेटर बुला की अनुमति देता है clsतर्क गणना करने के लिए एक समझ शब्दकोश का उपयोग कर निर्माता।
  • मैं भी एक सामान्य लिखा है __repr__सुविधापूर्वक आरईपीएल में उदाहरण के परीक्षण के लिए जो, वस्तु की स्थिति को दर्शाता है।

यहाँ एक उदाहरण है:

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

उदाहरण:

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

ध्यान दें कि मैं व्यवहार बदल दिया है हमेशा एक नई वस्तु वापस जाने के लिए, बजाय मौजूदा एक परिवर्तनशील की।

03/12/2019 को 00:08
का स्रोत उपयोगकर्ता

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