Bài Tập Chương 10: Thuộc Tính Và Phương Thức
Bài Tập 1: Khai báo thuộc tính và phương thức cơ bản
Yêu cầu:
Viết một lớp Python có tên Person
với hai thuộc tính name
và age
. Thêm một phương thức greet()
để in ra câu chào dạng "Xin chào, tôi là [name], năm nay tôi [age] tuổi."
Gợi ý:
Sử dụng phương thức __init__
để khởi tạo các thuộc tính khi tạo đối tượng. Sử dụng phương thức greet()
để in ra câu chào.
Điều kiện:
- Thuộc tính
name
vàage
phải được khởi tạo trong phương thức__init__
. - Phương thức
greet()
phải sử dụng các thuộc tínhname
vàage
.
Input mẫu:
person1 = Person("An", 30)
person1.greet()
Output mẫu:
Xin chào, tôi là An, năm nay tôi 30 tuổi.
Bài Tập 2: Sử dụng phương thức khởi tạo __init__
Yêu cầu:
Viết một lớp Python có tên Car
với các thuộc tính make
, model
, và year
. Sử dụng phương thức khởi tạo __init__
để gán giá trị cho các thuộc tính khi đối tượng được tạo ra. Thêm một phương thức get_info()
để in ra thông tin chi tiết về chiếc xe.
Gợi ý:
Phương thức __init__
được sử dụng để khởi tạo các thuộc tính ngay khi tạo đối tượng. Phương thức get_info()
in ra thông tin chi tiết về chiếc xe.
Điều kiện:
- Các thuộc tính
make
,model
, vàyear
phải được khởi tạo trong phương thức__init__
. - Phương thức
get_info()
phải sử dụng các thuộc tính này để in ra thông tin chi tiết.
Input mẫu:
car1 = Car("Toyota", "Camry", 2020)
car1.get_info()
Output mẫu:
Xe Toyota Camry sản xuất năm 2020
Bài Tập 3: Thêm phương thức tùy chỉnh
Yêu cầu:
Viết một lớp Python có tên Rectangle
với các thuộc tính width
và height
. Sử dụng phương thức __init__
để khởi tạo các thuộc tính. Thêm hai phương thức area()
và perimeter()
để tính diện tích và chu vi của hình chữ nhật.
Gợi ý:
Phương thức area()
và perimeter()
được định nghĩa để tính toán diện tích và chu vi của hình chữ nhật.
Điều kiện:
- Các thuộc tính
width
vàheight
phải được khởi tạo trong phương thức__init__
. - Phương thức
area()
trả về diện tích,perimeter()
trả về chu vi của hình chữ nhật.
Input mẫu:
rect1 = Rectangle(5, 10)
Output mẫu:
Diện tích: 50
Chu vi: 30
Bài Tập 4: Tính đóng gói với thuộc tính private
Yêu cầu:
Viết một lớp Python có tên BankAccount
với thuộc tính private _balance
. Thêm các phương thức deposit(amount)
và withdraw(amount)
để tăng và giảm số dư tài khoản. Thêm một phương thức get_balance()
để trả về số dư hiện tại.
Gợi ý:
Thuộc tính private (_balance
) chỉ có thể được truy cập và thay đổi thông qua các phương thức của lớp.
Điều kiện:
- Thuộc tính
_balance
phải là private. - Phương thức
deposit(amount)
tăng giá trị_balance
,withdraw(amount)
giảm giá trị_balance
. - Phương thức
get_balance()
trả về giá trị hiện tại của_balance
.
Input mẫu:
account = BankAccount(100)
account.deposit(50)
account.withdraw(30)
Output mẫu:
Số dư hiện tại: 120
Bài Tập 5: Kiểm tra và giới hạn giá trị của thuộc tính
Yêu cầu:
Viết một lớp Python có tên Temperature
với thuộc tính private _celsius
. Thêm phương thức set_temperature(temp)
để gán giá trị cho _celsius
. Nếu giá trị temp
nhỏ hơn -273.15, in ra thông báo lỗi "Nhiệt độ không thể thấp hơn -273.15°C". Thêm phương thức get_temperature()
để trả về giá trị hiện tại của _celsius
.
Gợi ý:
Sử dụng điều kiện để kiểm tra và giới hạn giá trị của thuộc tính _celsius
.
Điều kiện:
- Thuộc tính
_celsius
phải là private. - Phương thức
set_temperature(temp)
kiểm tra và chỉ gán giá trị nếutemp
>= -273.15. - Phương thức
get_temperature()
trả về giá trị hiện tại của_celsius
.
Input mẫu:
temp = Temperature()
temp.set_temperature(-300)
temp.set_temperature(25)
Output mẫu:
Nhiệt độ không thể thấp hơn -273.15°C
Nhiệt độ hiện tại: 25°C
Bài Tập 6: Tính đóng gói với phương thức private
Yêu cầu:
Viết một lớp Python có tên Counter
với thuộc tính private _count
và phương thức private _increment()
. Thêm phương thức increase()
để gọi _increment()
và in ra giá trị hiện tại của _count
. Thêm một phương thức reset()
để đặt lại giá trị của _count
về 0.
Gợi ý:
Phương thức private chỉ có thể được gọi từ bên trong lớp. Phương thức increase()
và reset()
điều khiển giá trị của _count
.
Điều kiện:
- Thuộc tính
_count
phải là private. - Phương thức
_increment()
là private và tăng giá trị_count
. - Phương thức
increase()
gọi_increment()
và in ra giá trị hiện tại của_count
. - Phương thức
reset()
đặt lại giá trị của_count
về 0.
Input mẫu:
counter = Counter()
counter.increase()
counter.increase()
counter.reset()
Output mẫu:
Giá trị hiện tại của _count: 1
Giá trị hiện tại của _count: 2
Giá trị _count đã được đặt lại về 0
Bài Tập 7: Sử dụng thuộc tính getter và setter
Yêu cầu:
Viết một lớp Python có tên Circle
với thuộc tính private _radius
. Sử dụng thuộc tính getter get_radius()
và setter set_radius(radius)
để truy cập và thay đổi giá trị của _radius
. Thêm phương thức area()
để tính diện tích hình tròn.
Gợi ý:
Sử dụng getter và setter để kiểm soát việc truy cập và thay đổi giá trị của thuộc tính private _radius
.
Điều kiện:
- Thuộc tính
_radius
phải là private. - Phương thức
set_radius(radius)
thay đổi giá trị_radius
, nếuradius
>= 0. - Phương thức
get_radius()
trả về giá trị hiện tại của_radius
. - Phương thức
area()
trả về diện tích của hình tròn.
Input mẫu:
circle = Circle(5)
circle.set_radius(10)
Output mẫu:
Bán kính: 10
Diện tích: 314.159
Bài Tập 8: Tính kế thừa và sử dụng phương thức khởi tạo
Yêu cầu:
Viết hai lớp Python Employee
và Manager
, trong đó Manager
kế thừa từ Employee
. Lớp Employee
có các thuộc tính name
và salary
. Lớp Manager
có thêm thuộc tính department
. Sử dụng phương thức khởi tạo __init__
của Employee
trong Manager
để khởi tạo các thuộc tính kế thừa.
Gợi ý:
Sử dụng từ khóa super()
để gọi phương thức khởi tạo của lớp cha.
Điều kiện:
- Lớp
Manager
phải kế thừa từEmployee
. - Thuộc tính
name
vàsalary
được khởi tạo trong lớpEmployee
. - Thuộc tính
department
được khởi tạo trong lớpManager
. - Phương thức
display_info()
in ra các thông tin củaManager
.
Input mẫu:
manager = Manager("An", 50000, "HR")
Output mẫu:
Name: An, Salary: 50000, Department: HR
Bài Tập 9: Tính đóng gói và kế thừa với thuộc tính và phương thức private
**Yêu
cầu:**
Viết một lớp Python có tên Product
với thuộc tính private _price
. Thêm phương thức set_price(price)
để gán giá trị cho _price
. Viết lớp DiscountedProduct
kế thừa từ Product
và thêm phương thức apply_discount(percentage)
để giảm giá sản phẩm theo phần trăm. Thuộc tính _price
chỉ có thể được truy cập và thay đổi từ lớp Product
.
Gợi ý:
Sử dụng kế thừa và tính đóng gói để bảo vệ thuộc tính _price
.
Điều kiện:
- Thuộc tính
_price
phải là private trongProduct
. - Phương thức
set_price(price)
trongProduct
kiểm tra và gán giá trị cho_price
. - Lớp
DiscountedProduct
kế thừa từProduct
và sử dụngapply_discount(percentage)
để giảm giá_price
.
Input mẫu:
dp = DiscountedProduct(100)
dp.apply_discount(10)
Output mẫu:
Giá sau khi giảm: 90
Bài Tập 10: Tạo lớp có các thuộc tính và phương thức ẩn
Yêu cầu:
Viết một lớp Python có tên SecureData
với thuộc tính private _data
và phương thức private _encrypt()
. Thêm phương thức store_data(data)
để mã hóa dữ liệu trước khi lưu vào _data
. Thêm phương thức retrieve_data()
để giải mã và trả về dữ liệu gốc.
Gợi ý:
Phương thức _encrypt()
và _decrypt()
là private, được sử dụng để mã hóa và giải mã dữ liệu trước khi lưu trữ và truy xuất.
Điều kiện:
- Thuộc tính
_data
phải là private. - Phương thức
_encrypt(data)
và_decrypt(data)
là private. - Phương thức
store_data(data)
mã hóa dữ liệu trước khi lưu vào_data
. - Phương thức
retrieve_data()
giải mã và trả về dữ liệu gốc.
Input mẫu:
secure_data = SecureData()
secure_data.store_data("HelloWorld")
Output mẫu:
Dữ liệu gốc: HelloWorld