Lập trình hướng đối tượng Python cho phép biến được sử dụng ở cấp độ lớp hoặc cấp độ instance (đối tượng), nơi biến đơn giản là các ký hiệu biểu thị giá trị bạn đang sử dụng trong chương trình.
Ở cấp độ lớp, biến được gọi là biến lớp (class variables) trong khi biến ở cấp độ instance được gọi là biến instance (instance variables). Hãy hiểu về biến lớp và biến instance qua một ví dụ đơn giản:
# Lớp Shark
class Shark:
animal_type = 'fish' # Biến lớp
def __init__(self, name, age):
self.name = name
self.age = age
# Tạo đối tượng của lớp Shark
obj1 = Shark("Jeeva", 54)
obj2 = Shark("Roli", 45)
print("In biến lớp sử dụng hai instance")
print("obj1.animal_type =", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)
# Thay đổi biến lớp sử dụng biến instance
obj1.animal_type = "BigFish"
print("\nIn biến lớp sau khi thay đổi một instance")
print("obj1.animal_type=", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)
Trong chương trình trên, chúng ta đã tạo lớp Shark và sau đó cố gắng thay đổi biến lớp bằng đối tượng, điều này sẽ tạo ra một biến instance mới cho đối tượng cụ thể đó và biến này che lấp (shadow) biến lớp.
Kết quả
In biến lớp sử dụng hai instance
obj1.animal_type = fish
obj2.animal_type = fish
In biến lớp sau khi thay đổi một instance
obj1.animal_type= BigFish
obj2.animal_type = fish
Hãy sửa đổi chương trình trên để có được kết quả đúng:
# Lớp Shark
class Shark:
animal_type = 'fish' # Biến lớp
def __init__(self, name, age):
self.name = name
self.age = age
# Tạo đối tượng của lớp Shark
obj1 = Shark("Jeeva", 54)
obj2 = Shark("Roli", 45)
print("In biến lớp sử dụng hai instance")
print("obj1.animal_type =", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)
# Thay đổi biến lớp thông qua chính lớp
# obj1.animal_type = "BigFish"
Shark.animal_type = "BigFish"
print("Giá trị biến lớp mới là %s, được thay đổi thông qua chính lớp" % (Shark.animal_type))
print("\nIn biến lớp sau khi thay đổi thông qua instances")
print("obj1.animal_type=", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)
Kết quả
In biến lớp sử dụng hai instance
obj1.animal_type = fish
obj2.animal_type = fish
Giá trị biến lớp mới là BigFish, được thay đổi thông qua chính lớp
In biến lớp sau khi thay đổi thông qua instances
obj1.animal_type= BigFish
obj2.animal_type = BigFish