创建一个Rectangle类

时间:2014-12-05 19:37:09

标签: python class

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

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

4 个答案:

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