How to use association in two classes in python programming

Question:

I have two classes: Rectangle() and Figures (). I need to connect these two classes with Association. But i have no idea how to call methods: get_perimeter() and get_area() from Rectangle() in Figures.

i need to use method get_perimeters() in class Figures with using Association. It means i must call a method get_perimeter() from class Rectangle(). First of all my class Figures() create an empty list, then it adds group of rectangles with using method add_rectangle() (for example it’ll be three rectangles (width=15, height=13; width=12, height=25 etc.)) And then when i call a method get_perimeters(), program need to show me perimeters of three rectangles (with using get_perimeter() from Rectangle class)

Here my code. If you have some ideas or offers about improving my code i’ll be thankful

Here my 2 classes:

class Rectangle:
    
    def __init__(self, width=None, height=None):
        
        self.width = width
        self.height = height
    
    def __str__(self):
        
        return "Rectangle with width {width} cm and height {height} cm".format(width=self.width, height=self.height)
       
    def get_area(self):
        
        return self.width * self.height
        
    def get_perimeter(self):
      
        return (self.width + self.height) * 2
       
    @staticmethod
    def get_info():
        
         return "This class calculates perimeter and area of the rectangles"
        

class Figures:
    
    def __init__(self, num_figures=None):
        self.figures = []
        self.num_figures = 0
        
    def __str__(self):
        
        return "Container containing figures"
    
    def __len__(self):
        
        return len(self.figures)

    def add_rectangle(self, width=None, height=None):
     
        if width and height != None:
            self.figures.append(Rectangle(width=width, height=height))
        else:
            print("You didn't provide width or height properly")
        
    def get_perimeters(self, width=None, height=None):
        pass   

    def get_areas(self, width=None, height=None):
       
        pass
    
    @staticmethod
    def get_info():
        
        return "This class creates the container containing the instances of class Rectangle"



   
Asked By: Lina

||

Answers:

Your code does store instances of Rectangle in figures using the method add_rectangle but your methods get_perimeters, get_areas, and get_info in class Figures aren’t doing any of those things. If we want to create three rectangles and then use the get_perimeter method, for example, we could enumerate through the instances stored as a list in your figures variable, call the get_perimeter instance method of class Rectangle, and print all three rectangles’ perimeters in the order in which they were instantiated:

def get_perimeters(self):
    for fig_num, fig in enumerate(self.figures):
        print("perimeter for figure number " + str(fig_num) + ": " + str(fig.get_perimeter()))

Also, num_figures doesn’t seem to be doing anything, and I’m guessing that you intend for it to keep track of the number of rectangles created. You could just put self.num_figures += 1 in method add_rectangle:

def add_rectangle(self, width=None, height=None):
    if width and height != None:
        self.num_figures += 1
        self.figures.append(Rectangle(width=width, height=height))

Whole thing:

class Rectangle:
    def __init__(self, width=None, height=None):
        self.width = width
        self.height = height

    def __str__(self):
        return "Rectangle with width {width} cm and height {height} cm".format(width=self.width, height=self.height)

    def get_area(self):
        return self.width * self.height

    def get_perimeter(self):
        return (self.width + self.height) * 2


class Figures:
    def __init__(self):
        self.figures = []
        self.num_figures = 0

    def __str__(self):
        return "Container containing figures"

    def __len__(self):
        return len(self.figures)

    def add_rectangle(self, width=None, height=None):
        if width and height != None:
            self.num_figures += 1
            self.figures.append(Rectangle(width=width, height=height))
        else:
            print("You didn't provide width or height properly")

    def get_perimeters(self):
        for fig_num, fig in enumerate(self.figures):
            print("perimeter for figure number " + str(fig_num) + ": " + str(fig.get_perimeter()))

    def get_areas(self):
        for fig_num, fig in enumerate(self.figures):
            print("area for figure number " + str(fig_num) + ": " + str(fig.get_area()))

    def get_info(self):
        """ This class creates the container containing the instances of class Rectangle
        """
        return self.figures

Let’s create three rectangles:

m = Figures()
m.add_rectangle(width=15, height=13) # first rectangle;
m.add_rectangle(width=12, height=25) # second rectangle;
m.add_rectangle(width=10, height=20) # third rectangle;

Calling methods get_areas and get_perimeters from class Figures, which uses methods get_area and get_perimeter from class Rectangle, and seeing how many num_figures there are:

m.get_areas()
m.get_perimeters()
print('number of figures is ' + str(m.num_figures))

outputs:

area for figure number 0: 195
area for figure number 1: 300
area for figure number 2: 200
perimeter for figure number 0: 56
perimeter for figure number 1: 74
perimeter for figure number 2: 60
number of figures is 3

We can use the method get_info to return instances of Rectangle, and then call methods (e.g. get_area) on one of its instances (e.g. first instance indexed at 0):

b = m.get_info() # b = all instances of class Rectangle;
b[0].get_area() # b[0] being the first instance of class Rectangle;

outputs:

195
Answered By: Ori Yarden
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.