Lớp hình chữ nhật với thuộc tính có kiểm tra
Một lớp đúng nghĩa không chỉ gom dữ liệu, nó còn giữ luật cho dữ liệu đó. Hình chữ nhật
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: python-basics, python-classes-intro.
Nội dung đề bài
Mô tả bài toán
Một lớp đúng nghĩa không chỉ gom dữ liệu, nó còn giữ luật cho dữ liệu đó. Hình chữ nhật là ví dụ gọn nhất: kích thước phải luôn dương, và mọi cửa được phép thay đổi kích thước đều phải đi qua cùng một chỗ kiểm tra. Bài này luyện @property kèm setter, thuộc tính riêng và phương thức biến đổi trạng thái.
Yêu cầu
Cài đặt lớp Rectangle với đúng các thành phần sau:
- init(self, width, height): nhận hai kích thước; ném ValueError nếu một trong
hai không dương. Kích thước được lưu riêng trong self._width và self._height.
- thuộc tính width và height: getter trả về giá trị đang lưu dưới dạng float;
setter từ chối giá trị không dương bằng ValueError.
- set_width(self, value): ghi qua thuộc tính width, trả về None.
- set_height(self, value): ghi qua thuộc tính height, trả về None.
- scale(self, factor): nhân cả hai kích thước với factor; ném ValueError nếu
factor không dương; trả về None.
- area(self): trả về diện tích.
- perimeter(self): trả về chu vi.
- is_square(self): trả về True khi hai kích thước bằng nhau, ngược lại False.
Quy ước nộp bài
Nộp lớp Rectangle trong solution.py. Hệ thống tự khởi tạo lớp rồi gọi phương thức trực tiếp, so từng giá trị trả về với sai số 1e-6 và bắt ngoại lệ ValueError; không đọc dữ liệu từ stdin và không in ra stdout.
Input
Hệ thống khởi tạo lớp bằng hai tham số từ khoá width và height, rồi gọi lần lượt các phương thức theo kịch bản của từng bộ test.
Output
Danh sách giá trị trả về của từng lượt gọi, theo đúng thứ tự được gọi. Ba phương thức biến đổi trạng thái (set_width, set_height, scale) trả về None.
Ràng buộc
- width, height và factor là số thực.
- Mọi giá trị không dương phải bị chặn ngay tại cửa vào bằng ValueError.
- is_square trả về bool; area và perimeter trả về float.
Ví dụ 1
Input
Rectangle(init={"width": 3, "height": 4}, methods=[{"method": "area"}, {"method": "perimeter"}, {"method": "is_square"}])
Output
[12.0, 14.0, false]
Ví dụ 2
Input
Rectangle(init={"width": 5, "height": 5}, methods=[{"method": "is_square"}, {"method": "area"}])
Output
[true, 25.0]
Giải thích
Với width=3, height=4, gọi area(), perimeter(), is_square() thì kết quả lần lượt là 12.0, 14.0, False. Nếu gọi thêm scale(2) thì kích thước trở thành 6 và 8, nên area() trả 48.0.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
