面向对象的Python - 使用类和函数的矩形

时间:2015-06-20 20:12:40

标签: python function class oop methods

我正在用Python创建一个程序,它将利用面向对象的编程来打印给定矩形的属性。该项目有这些限制:

  

本实验的目的是让您练习创建自己的实践   宾语。您将获得一个期望实例的主函数   (尚未定义的)Rectangle对象。你的工作是确定什么   Rectangle类需要的属性和方法,并创建一个类   这将满足要求。

     
      
  • 一次只添加一项功能
  •   
  • 您可能需要注释掉部分主要功能以进行测试
  •   
  • 构造函数应该使用0,1或2个参数(说明多态)
  •   
  • 你的类应该是某个东西的子类(说明继承)
  •   
  • 您的课程应该有方法和属性(说明封装)
  •   
  • 隐藏实例变量(使用__技巧)
  •   
  • 为每个实例变量添加setter和getter方法
  •   
  • 使用属性封装实例变量访问
  •   
  • 并非所有实例变量都是真实的......有些是派生的,应该是只写的
  •   
  • 你可能不会大幅改变主要功能(除非你正在进行黑带挑战)
  •   
  • 确保在需要时添加所需的代码以运行主要功能
  •   

这是标题

  • 代码:main()函数相对不变3
  • 代码:使用默认值声明Rectangle类,因此它支持0,1和2参数3
  • 代码:实例化Rectangle(5,7)2
  • 代码:实例化Rectangle()2
  • 代码:Rectangle类定义__实例变量2
  • 代码:为每个实例变量2
  • 定义getter和setter
  • 代码:矩形类包括区域和周边方法4
  • 代码:Rectangle类继承自某事物,即使它是对象2
  • 代码:Rectangle类定义宽度和长度属性4
  • 代码:Rectangle包含派生的只读实例变量2
  • 代码:当python文件作为主要文件2执行时调用main
  • 代码:Rectangle类定义返回字符串4
  • 的getStats()方法
  • 执行:打印矩形a:1
  • 执行:打印区域:35 1
  • 执行:打印周长:24 1
  • 执行:打印矩形b:1
  • 执行:打印宽度:10 1
  • 执行:打印高度:20 1
  • 执行:打印区域:200 1
  • 执行:打印周长:60 1

得分40

我从这个代码开始:

def main():
print "Rectangle a:"
a = Rectangle(5, 7)
print "area:      %d" % a.area
print "perimeter: %d" % a.perimeter

print ""
print "Rectangle b:"
b = Rectangle()
b.width = 10
b.height = 20
print b.getStats()

我应该得到这个输出:

Rectangle a:
area:      35
perimeter: 24
Rectangle b:
width:     10
height:    20
area:      200
perimeter: 60

我已经走到这一步但我无法通过Rectangle B来打印宽度和高度你能看一下吗?

class Rectangle:
    def __init__(self, width=0, height=0):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def perimeter(self):
        return 2 * self.height + 2 * self.width

    def setWidth(self, width):
        self.width = width

    def setHeight(self, height):
        self.height = height

    def getStats(self):
        return "area:      %s\nperimeter: %s" % (self.area(), self.perimeter())


def main():
    print ""
    print "Rectangle a:"
    a = Rectangle(5, 7)
    print "area:      %s" % a.area()
    print "perimeter: %s" % a.perimeter()

    print ""
    print "Rectangle b:"
    b = Rectangle()
    b.width = 10
    b.height = 20
    print b.getStats()
    print ""


main()

我目前正在获得此输出:

Rectangle a:
area:      35
perimeter: 24

Rectangle b:
area:      200
perimeter: 60


Process finished with exit code 0

2 个答案:

答案 0 :(得分:0)

不确定我的问题是否正确,但您可能想尝试:

def getStats(self):
    return "width:      %s\nheight:      %s\narea:      %s\nperimeter: %s" % (self.width, self.height, self.area(), self.perimeter())

为了满足要求4和6,我建议如下:

class Shape(object):
    def area(self):
        raise NotImplementedError

    def perimeter(self):
        raise NotImplementedError

class Rectangle(Shape):
    def __init__(self, width=0, height=0):
        super(Rectangle, self).__init__() # this is useless in this case, but it's good practice 
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

    def perimeter(self):
        return 2 * self.height + 2 * self.width

    @property
    def width(self):
        return self.__width

    @property
    def height(self):
        return self.__height

    @width.setter
    def width(self, width):
        self.__width = width

    @height.setter
    def height(self, height):
        self.__height = height

    def getStats(self):
        return "width:      %s\nheight:      %s\narea:      %s\nperimeter: %s" % (self.width, self.height, self.area(), self.perimeter())

答案 1 :(得分:0)

注意:这个作业是我计算机科学课的精确作业。虽然欢迎您从堆栈溢出等网站获得帮助,但您仍然对自己的工作负责,如果您从本网站上交代码(可能接受也可能不接受)我们会知道,我们会认为它是学术性的不当行为。我们也可能对作业进行了一些安静的修改,所以如果你在没有仔细考虑的情况下回答这个问题,你甚至不可能得到完全的信用