-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path9-rectangle.py
executable file
·154 lines (122 loc) · 3.73 KB
/
9-rectangle.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/python3
"""Rectangle Module"""
class Rectangle():
"""Rectangle Class"""
number_of_instances = 0
print_symbol = '#'
def __init__(self, width=0, height=0):
"""Initialize instance variables
Keyword Arguments:
width -- width of the rectangle (default: {0})
height -- height of the rectangle (default: {0})
"""
self.width = width
self.height = height
Rectangle.number_of_instances += 1
@property
def width(self):
"""width getter
Returns:
The width
"""
return self.__width
@width.setter
def width(self, value):
"""width setter
Arguments:
value -- The new value of the width
Raises:
TypeError: width must be an integer
ValueError: width must be >= 0
"""
if not isinstance(value, int):
raise TypeError("width must be an integer")
elif value < 0:
raise ValueError("width must be >= 0")
self.__width = value
@property
def height(self):
"""height getter
Returns:
The height
"""
return self.__height
@height.setter
def height(self, value):
"""height setter
Arguments:
value -- The new value of the height
Raises:
TypeError: height must be an integer
ValueError: height must be >= 0
"""
if not isinstance(value, int):
raise TypeError("height must be an integer")
elif value < 0:
raise ValueError("height must be >= 0")
self.__height = value
def area(self):
"""Rectangle area
Returns:
Rectangle area
"""
return self.width * self.height
def perimeter(self):
"""Rectangle perimeter
Returns:
Rectangle perimeter
"""
if self.width == 0 or self.height == 0:
return 0
return 2 * (self.width + self.height)
def __str__(self):
"""String representation of the class
Returns:
Readable String
"""
if self.width == 0 or self.height == 0:
return ""
objstr = []
for _ in range(self.height):
objstr.append("{:s}".format(self.print_symbol) * self.width)
if _ != self.height - 1:
objstr.append("\n")
return "".join(objstr)
def __repr__(self):
"""Official string representation of the class
Returns:
Serialized string
"""
return "Rectangle({:d}, {:d})".format(self.width, self.height)
@staticmethod
def bigger_or_equal(rect_1, rect_2):
"""Find the biggest rectangle's area
Arguments:
rect_1 -- rectangle 1
rect_2 -- rectangle 2
Raises:
TypeError: rect_# must be an instance of Rectangle
Returns:
The biggest rectangle's area
"""
if not isinstance(rect_1, Rectangle):
raise TypeError("rect_1 must be an instance of Rectangle")
elif not isinstance(rect_2, Rectangle):
raise TypeError("rect_2 must be an instance of Rectangle")
if rect_1.area >= rect_2.area:
return rect_1
else:
return rect_2
@classmethod
def square(cls, size=0):
"""Turn rectangle into square
Keyword Arguments:
size -- Size of the square (default: {0})
Returns:
New rectangle instance with size == width == height
"""
return cls(size, size)
def __del__(self):
"""Deconstructor"""
Rectangle.number_of_instances -= 1
print("Bye rectangle...")