我真的不太懂课程,任何帮助都会很棒。
Rectangle类应具有以下私有数据属性:
__length
__width
Rectangle类应该有一个__init__
方法来创建这些属性并将它们初始化为1.它还应该有以下方法:
set_length
- 此方法为__length
字段
set_width
- 此方法为__width
字段
get_length
- 此方法返回__length
字段的值
get_width
- 此方法返回__width
字段的值
get_area
- 此方法返回Rectangle
__str__
- 此方法返回对象的状态
class Rectangle:
def __init__(self):
self.set_length = 1
self.set_width = 1
self.get_length = 1
self.get_width = 1
self.get_area = 1
def get_area(self):
self.get_area = self.get_width * self.get_length
return self.get_area
def main():
my_rect = Rectangle()
my_rect.set_length(4)
my_rect.set_width(2)
print('The length is',my_rect.get_length())
print('The width is', my_rect.get_width())
print('The area is',my_rect.get_area())
print(my_rect)
input('press enter to continue')
答案 0 :(得分:4)
Python并不限制对私有数据属性的访问,因此您很少让自己像限制语言一样编写“getters”和“setter”(我们都同意成年人)。
除非它是供内部使用的东西(您将来可能会更改的实现细节),您只需将属性公开给世界 - 所以一个更惯用的Rectangle就是这样:
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
然后:
>>> r = Rectangle(5, 10)
>>> r.area
50
>>> r.width = 100
>>> r.area
1000
当然,您可以使用getter和setter编写Rectancle类,但只有在想要验证或转换输入时才这样做 - 那么您可能想要了解有关@property decorator的更多信息。
答案 1 :(得分:2)
首先,这项任务是一个非常糟糕的主意。在Python中,你几乎从不想要“私有”属性以及getter和setter函数,无论是谁教你这样做都会让你误入歧途。
但是,如果你只想传递作业而不是学习如何编写合适的Python代码,那么你就是这样做的。
首先,要创建名为__length
的属性,您只需分配给它,与任何其他属性相同:
def __init__(self):
self.__length = 1
现在,要为该属性编写getter和setter,请执行相同的操作:
def get_length(self):
return self.__length
def set_length(self, length):
self.__length = length
现在,get_area
有点棘手,因为你没有__area
。 (这是一个愚蠢的想法,因为它看起来就像一个getter函数,即使它不是......)但你知道如何找出一个矩形的区域:它只是长度乘以宽度,正确?
def get_area(self):
return self.__length * self.__width
__str__
方法是整个作业中唯一的好主意 - 尽管为这样的类编写__str__
而不是__repr__
可能是个坏主意。无论如何,这两个方法都只返回一个字符串,其中包含对象的一些有用表示。 str
对最终用户应该是友好的,而repr
应该对程序员(您或使用您的类的人)有用。例如:
def __str__(self):
return '{} x {} rectangle'.format(self.__length, self.__width)
def __repr__(self):
return '{}({}, {})'.format(type(self).__name__, self.__length, self.__width)
答案 2 :(得分:1)
您的class
存在一些问题。见以下评论
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)
测试班级
>>> 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
正如其他人所指出的那样,setter和getter在Python中是多余的,因为所有成员变量都是公共的。我知道这些方法是您的任务所必需的,但将来知道您可以省去麻烦并直接访问成员
>>> a.length # Instead of the getter
5
>>> a.length = 2 # Instead of the setter
>>> a.length
2
答案 3 :(得分:1)
如果没有set_和get_的函数,你会做得很好。在使用受损变量(例如__variablename)时你应该更加小心,但这里有一个不太精彩的代码可以满足你的要求。希望这会有所帮助。
PS:用Python 2.7格式打印语句。
class Rectangle():
def __init__(self):
self.__length = 1.0
self.__width = 1.0
def __str__(self):
return "This is class Rectangle"
def set_length(self,len=1.0): #len=1 --> default value
self.__length = len
def set_width(self,wid=1.0): #wid=1 --> default value
self.__width = wid
def get_length(self):
return self.__length
def get_width(self):
return self.__width
def get_area(self):
return self.get_width() * self.get_length()
if __name__ == '__main__':
my_rect = Rectangle()
my_rect.set_length(4.0)
my_rect.set_width(2.0)
print "The length is ", my_rect.get_length()
print "The width is ", my_rect.get_width()
print "The area is ", my_rect.get_area()
print my_rect
raw_input('Press enter to continue')