python – Creating a Rectangle class
python – Creating a Rectangle class
Python does not restrict the access to private data attributes, so you seldom get yourself writing getters and setters like in more restrictive languages (we are all consenting adults).
Except when it is something for internal use (an implementation detail that you may change in the future) you just expose the property to the world – so a more idiomatic Rectangle would be just this:
class Rectangle(object):
def __init__(self, width=1, height=1):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
Then:
>>> r = Rectangle(5, 10)
>>> r.area
50
>>> r.width = 100
>>> r.area
1000
Of course you can write the Rectancle class using getters and setters, but you only do that when you want to validate or transform the input – then you probably want to learn more about the @property decorator.
Youve got a few issues with your class
. See the below comments
class Rectangle:
# Init function
def __init__(self):
# The only members are length and width
self.length = 1
self.width = 1
# Setters
def set_width(self, width):
self.width = width
def set_length(self, length):
self.length = length
# Getters
def get_width(self):
return self.width
def get_length(self):
return self.length
def get_area(self):
return self.length * self.width
# String representation
def __str__(self):
return length = {}, width = {}.format(self.length, self.width)
Testing the class
>>> a = Rectangle()
>>> a.set_width(3)
>>> a.set_length(5)
>>> a.get_width()
3
>>> a.get_length()
5
>>> a.get_area()
15
>>> print(a)
length = 5, width = 3
As others have noted, setters and getters are superfluous in Python, as all member variables are public. I understand that these methods are required for your assignment, but in the future, know that you can save yourself the trouble and just directly access the members
>>> a.length # Instead of the getter
5
>>> a.length = 2 # Instead of the setter
>>> a.length
2
python – Creating a Rectangle class
First, this assignment is a very bad idea. In Python, you almost never want private attributes and getter and setter functions, and whoevers teaching you to do this is leading you astray.
But, if you just want to pass the assignment instead of learning how to write decent Python code, heres how you do it.
First, to create an attribute named __length
, you just assign to it, the same as any other attribute:
def __init__(self):
self.__length = 1
Now, to write getters and setters for that attribute, do the same thing:
def get_length(self):
return self.__length
def set_length(self, length):
self.__length = length
Now, get_area
is a bit trickier, because you dont have an __area
to get. (This is a stupid idea, because it looks like a getter function even though it isnt…) But you know how to figure out the area of a rectangle: its just the length times the width, right?
def get_area(self):
return self.__length * self.__width
The __str__
method is the only good idea in the whole assignment—although its probably a bad idea to write a __str__
without a __repr__
for a class like this. Anyway, both of these are methods that just return a string with some useful representation of your objects. The str
should be something friendly to an end-user, while the repr
should be something useful to the programmer (you, or someone using your class). For example:
def __str__(self):
return {} x {} rectangle.format(self.__length, self.__width)
def __repr__(self):
return {}({}, {}).format(type(self).__name__, self.__length, self.__width)