Được, tuy nhiên, chỉ đúng khi bạn khởi tạo 1 instance thôi
class Employee:
numbers = 0
def __init__(self, name):
self.name = name
Employee.numbers += 1
self.n = Employee.numbers
a = Employee('A')
print(a.numbers)
b = Employee('B')
print(b.numbers)
Kết quả
1
2
Tuy nhiên
class Employee:
numbers = 0
def __init__(self, name):
self.name = name
self.numbers += 1
self.n = self.numbers
a = Employee('A')
print(a.numbers)
b = Employee('B')
print(b.numbers)
Kết quả
1
1
Tại sao lại như vậy? Ở đây, chúng ta vẫn chưa đi sâu hết vấn đề. Chúng ta hãy quay trở lại cái ví dụ đầu tiên và mình thêm một câu lệnh để làm rõ cái mình sắp nói
class Employee:
numbers = 0
def __init__(self, name):
self.name = name
Employee.numbers += 1
self.n = Employee.numbers
a = Employee('A')
print(a.numbers)
b = Employee('B')
print(b.numbers)
# kiểm tra lại a numbers
print(a.numbers)
Kết quả
1
2
2
Wow, mình nghĩ ít nhiều bạn cũng bất ngờ là tại sao attribute numbers
của a
lại bị thay đổi.
Nhìn chung khi bạn sử dụng Employee
thì bạn đang sử dụng lớp (mang tính toàn cục), còn khi bạn sử dụng self
thì bạn đang sử dụng đối tượng (cục bộ). Để mình giải thích ý của mình.
Khi thay đổi giá trị một thuộc tính được khai báo trong lớp thông qua lớp thì thuộc tính ở toàn bộ đối tượng thuộc lớp đó sẽ được cập nhật lại giá trị mới.
Còn khi bạn thay đổi giá trị thuộc tính của một đối tượng, thì chỉ có đối tượng đó bị thay đổi, còn lớp của chúng ta vẫn như vậy. Và dĩ nhiên nếu như có nhiều đối tượng khác nó cũng vẫn sẽ không bị ảnh hưởng chung như khi thay đổi bởi lớp.
Mình có một bài viết về phần này. Bạn cũng có thể tham khảo đường link How Kteam