-6

运行程序时出现错误

Enter the length of the rectangle: 4
Enter the width of the rectangle: 2
Traceback (most recent call last):
  File "C:\Users\Shourav\Desktop\rectangle_startfile.py", line 50, in <module>
    main()
  File "C:\Users\Shourav\Desktop\rectangle_startfile.py", line 34, in main
    my_rect = Rectangle()
TypeError: __init__() missing 2 required positional arguments: 'length' and 'width'

代码:

# class definition

class Rectangle:

    def __init__(self, length, width):

        self.__length = length
        self.__width = width
        self.__area = area

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

    def set_width(self, width):
        self.__width = width

    def get_length(self, length):
        return self.__length

    def get_width(self, width):
        return self.__width

    def get_area(self, length, width):
        area = (length * width)
        self.__area = area
        return self.__area


# main function
def main():

    length = int(input("Enter the length of the rectangle: "))
    width = int(input("Enter the width of the rectangle: "))

    my_rect = Rectangle()

    my_rect.set_length(length)
    my_rect.set_width(width)

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


# Call the main function

main()
4

4 回答 4

3

您定义了一个Rectangle类,其初始化方法需要两个参数:

class Rectangle:
    def __init__(self, length, width):

但是您尝试在传递这些参数的情况下创建一个:

my_rect = Rectangle()

改为传递长度和宽度:

my_rect = Rectangle(length, width)

您的下一个问题是area未定义,您可能想要计算:

class Rectangle:
    def __init__(self, length, width):
        self.__length = length
        self.__width = width
        self.get_area(length, width)

在设计说明上:通常在 Python 中,您不会使用这样的“私有”变量;只需使用普通属性即可:

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

    @property
    def area(self):
        return self.length * self.width

并根据需要直接获取或设置实例上的这些属性:

print('The length is', my_rect.length)
print('The width is', my_rect.width)
print('The area is', my_rect.area)

以双下划线 ( ) 开头的属性__name是为了避免子类意外地重新定义它们;目的是保护这些属性不被破坏,因为它们对当前类的内部工作至关重要。他们的名字被破坏并因此难以访问的事实并没有真正使他们变得私密,只是更难获得。无论您做什么,都不要像在 Java 中那样将它们误认为是私有名称。

于 2013-07-23T14:48:53.567 回答
0

当您声明my_rect = Rectangle()它需要lengthwidth按照Rectangle __init__方法中的说明传递给它时。

于 2013-07-23T14:49:39.783 回答
0

Rectangle 的构造函数需要两个您未设置的参数。

看:

class Rectangle:

    def __init__(self, length, width):

    my_rect = Rectangle()

你需要:

    my_rect = Rectangle(length, width)

仅供参考:

构造函数中的 self 参数是一个将隐式传递的参数,因此您不要传递它(至少不是通过在代码中实现它)。

于 2013-07-23T14:49:40.640 回答
0

__init__您在类中定义的方式Rectangle要求您使用长度和宽度来调用它:

def __init__(self, length, width):

改变

my_rect = Rectangle()

my_rect.set_length(length)
my_rect.set_width(width)

my_rect = Rectangle(length, width)
于 2013-07-23T14:49:40.750 回答