关于python:创建矩形类

Creating a Rectangle class

我真的不太懂课程,任何帮助都会很好。

矩形类应具有以下私有数据属性:

  • __length
  • __width

Rectangle类应该有一个创建这些属性并将其初始化为1的__init__方法。它还应具有以下方法:

  • set_length—此方法为__length字段赋值。

  • set_width—此方法为__width字段赋值。

  • get_length—此方法返回__length字段的值。

  • get_width—此方法返回__width字段的值。

  • get_area—此方法返回矩形的面积

  • __str__—此方法返回对象的状态

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


python不限制对私有数据属性的访问,因此您很少像使用更严格的语言那样编写"getter"和"setter"(我们都是同意的成年人)。

除非它是供内部使用的(将来可能会更改的实现细节),否则您只需将该属性向世界公开—因此更惯用的矩形将是:

1
2
3
4
5
6
7
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

然后:

1
2
3
4
5
6
>>> r = Rectangle(5, 10)
>>> r.area
50
>>> r.width = 100
>>> r.area
1000

当然,您可以使用getter和setter编写rectancle类,但只有当您想验证或转换输入时才这样做-然后您可能想了解有关@property decorator的更多信息。


首先,这个任务是一个非常糟糕的主意。在Python中,您几乎不需要"private"属性、getter和setter函数,而任何教您这样做的人都会将您引入歧途。

但是,如果你只是想通过任务,而不是学习如何编写合适的Python代码,下面是你的方法。

首先,要创建一个名为__length的属性,只需为其分配与任何其他属性相同的属性:

1
2
def __init__(self):
    self.__length = 1

现在,要为该属性编写getter和setter,请执行相同的操作:

1
2
3
4
5
def get_length(self):
    return self.__length

def set_length(self, length):
    self.__length = length

现在,get_area有点棘手,因为你没有一个__area可以得到。(这是一个愚蠢的想法,因为它看起来像一个getter函数,即使它不是…)但是你知道如何计算一个矩形的面积:它只是长度乘以宽度,对吗?

1
2
def get_area(self):
    return self.__length * self.__width

在整个任务中,__str__方法是唯一的好主意,尽管对于这样的类,编写一个没有__repr____str__可能是一个坏主意。不管怎样,这两个方法都只是返回一个带有一些有用对象表示的字符串。str对最终用户应该是友好的,而repr对程序员(您或使用您的类的人)应该是有用的。例如:

1
2
3
4
5
def __str__(self):
    return '{} x {} rectangle'.format(self.__length, self.__width)

def __repr__(self):
    return '{}({}, {})'.format(type(self).__name__, self.__length, self.__width)


如果没有集合和获取函数,您可以做得非常好,并且在使用损坏的变量(如变量名)时应该更加小心,但是这里有一个不太出色的代码来满足您的需求。希望有帮助。

ps:python 2.7格式的打印语句。

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


你的class有一些问题。见以下评论

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

测试课程

1
2
3
4
5
6
7
8
9
10
11
>>> 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

正如其他人所指出的,在Python中,setter和getter是多余的,因为所有成员变量都是公共的。我知道这些方法对你的任务是必需的,但是在将来,你要知道你可以省去麻烦,直接访问成员。

1
2
3
4
5
>>> a.length       # Instead of the getter
5
>>> a.length = 2   # Instead of the setter
>>> a.length
2