Thuộc tính lớp và đối tượng là gì? Có gì khác biệt? Tại sao?
Trước khi so sánh và ví dụ về các thuộc tính lớp và đối tượng, trước tiên hãy xác định chúng -
- Một thuộc tính lớp là một biến thuộc về một lớp nhất định chứ không phải là một đối tượng cụ thể. Mỗi phiên bản của lớp này chia sẻ cùng một biến. Các thuộc tính này thường được xác định bên ngoài hàm tạo
__init__
.class attribute is a variable that belongs to a certain class, and not a particular object. Every instance of this class shares the same variable. These attributes are usually defined outside the__init__
constructor. - Thuộc tính thể hiện/đối tượng là một biến thuộc về một đối tượng [và chỉ một] đối tượng. Mỗi phiên bản của một lớp trỏ đến các biến thuộc tính của chính nó. Các thuộc tính này được xác định trong hàm tạo
__init__
.instance/object attribute is a variable that belongs to one [and only one] object. Every instance of a class points to its own attributes variables. These attributes are defined within the__init__
constructor.
Tại sao mặc dù?
Tại sao người ta cần sử dụng các thuộc tính lớp và thuộc tính đối tượng?
Trong một thế giới song song chỉ có những con chó, mỗi con chó có một cái tên và một độ tuổi. Tổng số con chó phải được cập nhật mọi lúc. Tất cả điều này phải được xác định trong một lớp! Điều này có thể trông giống như thế này:
class Dog:
dogs_count = 0 def __init__[self, name, age]:
self.name = name
self.age = age
print["Welcome to this world {}!".format[self.name]]
Dog.dogs_count += 1 def __del__[self]:
print["Goodbye {} :[".format[self.name]]
Dog.dogs_count -= 1
Trong lớp này, chúng tôi có một thuộc tính lớp dogs_count
. Biến này theo dõi số lượng chó chúng ta có trong thế giới chó của chúng ta. Chúng tôi có hai thuộc tính thể hiện, name
và age
. Các biến này là duy nhất cho mỗi con chó [thuộc tính của mọi trường hợp có các vị trí bộ nhớ khác nhau]. Mỗi khi chức năng __init__
được thực thi, dogs_count
tăng lên. Tương tự như vậy - mỗi khi một con chó chết [không may là những con chó không sống mãi mãi trong thế giới này], gọi phương pháp
a = Dog["Max", 1]2,
print["Number of dogs: {}".format[Dog.dogs_count]]
b = Dog["Charlie", 7]
del a
c = Dog["Spot", 4.5]
print["Number of dogs: {}".format[Dog.dogs_count]]
del b
del c
print["Number of dogs: {}".format[Dog.dogs_count]]Output:
Welcome to this world Max!
Number of dogs: 1
Welcome to this world Charlie!
Goodbye Max :[
Welcome to this world Spot!
Number of dogs: 2
Goodbye Charlie :[
Goodbye Spot :[
Number of dogs: 0
dogs_count
giảm.a = Dog["Max", 1]
print["Number of dogs: {}".format[Dog.dogs_count]]
b = Dog["Charlie", 7]
del a
c = Dog["Spot", 4.5]
print["Number of dogs: {}".format[Dog.dogs_count]]
del b
del c
print["Number of dogs: {}".format[Dog.dogs_count]]Output:
Welcome to this world Max!
Number of dogs: 1
Welcome to this world Charlie!
Goodbye Max :[
Welcome to this world Spot!
Number of dogs: 2
Goodbye Charlie :[
Goodbye Spot :[
Number of dogs: 0
Ah ha! Chúng tôi đã quản lý để gán các biến duy nhất cho một đối tượng trong khi có một biến được chia sẻ mà tất cả các đối tượng chứa.
Kế thừa của các thuộc tính
Trước khi mở chủ đề này, hãy để Lừa xem thuộc tính
a = Dog["Max", 1]4 tích hợp.
print["Number of dogs: {}".format[Dog.dogs_count]]
b = Dog["Charlie", 7]
del a
c = Dog["Spot", 4.5]
print["Number of dogs: {}".format[Dog.dogs_count]]
del b
del c
print["Number of dogs: {}".format[Dog.dogs_count]]Output:
Welcome to this world Max!
Number of dogs: 1
Welcome to this world Charlie!
Goodbye Max :[
Welcome to this world Spot!
Number of dogs: 2
Goodbye Charlie :[
Goodbye Spot :[
Number of dogs: 0
class Example:
classAttr = 0
def __init__[self, instanceAttr]:
self.instanceAttr = instanceAttra = Example[1]
print[a.__dict__]
print[Example.__dict__]Output:
{'instanceAttr': 1}
{'__module__': '__main__', '__doc__': None, '__dict__': , '__init__': , 'classAttr': 0, '__weakref__': }
Như chúng ta có thể thấy, cả lớp và đối tượng đều có từ điển với các khóa và giá trị thuộc tính. Từ điển lớp lưu trữ nhiều thuộc tính tích hợp mà một thể hiện không chứa.
b = Example[2]
print[b.classAttr]
print[Example.classAttr]
b.classAttr = 653
print[b.classAttr]
print[Example.classAttr]Output:
0
0
653
0
Woah. Mang lại những gì tôi đã viết trước đó, mỗi trường hợp của một lớp chia sẻ cùng một thuộc tính lớp. Chuyện gì đã xảy ra ở đây? Chúng tôi đã thay đổi thuộc tính lớp của một trường hợp nhất định, nhưng biến được chia sẻ thực sự thay đổi. Nhìn vào từ điển của các yếu tố này sẽ cung cấp thêm cái nhìn sâu sắc:Bringing back what I wrote earlier, each instance of a class shares the same class attributes. What happened here? We changed the class attribute of a certain instance, but the shared variable didn’t actually change. Taking a look at the dictionaries of these elements will give further insight:
b = Example[2]
print[b.__dict__]
print[Example.__dict__]
b.classAttr = 653
print[b.__dict__]
print[Example.__dict__]Output:
{'instanceAttr': 2}
'__module__': '__main__', '__doc__': None, '__dict__': , '__init__': , 'classAttr': 0, '__weakref__': }
{'instanceAttr': 2, 'classAttr': 653}
{'__module__': '__main__', '__doc__': None, '__dict__': , '__init__': , 'classAttr': 0, '__weakref__': }
Nhìn kỹ, chúng tôi nhận thấy rằng
a = Dog["Max", 1]5 đã được thêm vào từ điển của đối tượng, với giá trị sửa đổi của nó. Từ điển lớp học vẫn giữ nguyên, điều này cho thấy các thuộc tính lớp có thể hoạt động như các thuộc tính thể hiện đôi khi.
print["Number of dogs: {}".format[Dog.dogs_count]]
b = Dog["Charlie", 7]
del a
c = Dog["Spot", 4.5]
print["Number of dogs: {}".format[Dog.dogs_count]]
del b
del c
print["Number of dogs: {}".format[Dog.dogs_count]]Output:
Welcome to this world Max!
Number of dogs: 1
Welcome to this world Charlie!
Goodbye Max :[
Welcome to this world Spot!
Number of dogs: 2
Goodbye Charlie :[
Goodbye Spot :[
Number of dogs: 0
Sự kết luận
Tóm lại, các thuộc tính lớp và đối tượng cực kỳ hữu ích nhưng có thể trở nên lộn xộn khi được sử dụng cùng nhau. Các thuộc tính lớp thuận lợi khi mỗi đối tượng cần chia sẻ một biến, chẳng hạn như bộ đếm. Các thuộc tính đối tượng có lợi thế khi mỗi đối tượng duy nhất cần các giá trị riêng của nó, một cái gì đó làm cho chúng khác với các đối tượng khác.