Mặc dù anwer được chấp nhận là tại chỗ, tôi muốn thêm một chút mô tả.
Hãy làm một bài tập nhỏ
trước hết định nghĩa một lớp như sau:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
vậy chúng ta có gì ở đây nào?
- Chúng ta có một lớp rất đơn giản có một thuộc tính
templà một chuỗi
- Một
__init__phương thức thiết lậpself.x
- Một bộ phương thức thay đổi
self.temp
Khá thẳng về phía trước cho đến nay yeah? Bây giờ hãy bắt đầu chơi xung quanh với lớp này. Trước tiên hãy khởi tạo lớp này:
a = A('Tesseract')
Bây giờ làm như sau:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
Vâng, a.templàm việc như mong đợi nhưng làm thế quái nào A.templàm việc? Vâng, nó hoạt động vì temp là một thuộc tính lớp. Tất cả mọi thứ trong python là một đối tượng. Ở đây A cũng là một đối tượng của lớp type. Do đó, temp thuộc tính là một thuộc tính được giữ bởi Alớp và nếu bạn thay đổi giá trị của temp thông qua A(và không thông qua một thể hiện a), giá trị thay đổi sẽ được phản ánh trong tất cả các thể hiện của Alớp. Hãy tiếp tục và làm điều đó:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
Thật thú vị phải không? Và lưu ý rằng id(a.temp)và id(A.temp)vẫn giống nhau .
Bất kỳ đối tượng Python nào cũng tự động được cung cấp một __dict__thuộc tính, chứa danh sách các thuộc tính của nó. Chúng ta hãy điều tra những gì từ điển này chứa cho các đối tượng ví dụ của chúng tôi:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
Lưu ý rằng tempthuộc tính được liệt kê trong số các Athuộc tính của lớp trong khi xđược liệt kê ví dụ.
Vì vậy, tại sao chúng ta có được một giá trị được xác định a.tempnếu nó thậm chí không được liệt kê cho ví dụ a. Vâng, đó là sự kỳ diệu của __getattribute__()phương pháp. Trong Python, cú pháp chấm tự động gọi phương thức này để khi chúng ta viết a.temp, Python thực thi a.__getattribute__('temp'). Phương thức đó thực hiện hành động tra cứu thuộc tính, tức là tìm giá trị của thuộc tính bằng cách tìm ở những nơi khác nhau.
Việc thực hiện tiêu chuẩn __getattribute__()tìm kiếm trước tiên là từ điển nội bộ ( dict ) của một đối tượng, sau đó là loại đối tượng. Trong trường hợp này a.__getattribute__('temp')thực thi đầu tiên a.__dict__['temp']và sau đóa.__class__.__dict__['temp']
Được rồi bây giờ hãy sử dụng changephương pháp của chúng tôi :
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
Bây giờ chúng tôi đã sử dụng self, print(a.temp)cung cấp cho chúng tôi một giá trị khác print(A.temp).
Bây giờ nếu chúng ta so sánh id(a.temp)và id(A.temp), chúng sẽ khác nhau.
listnhư một tên thuộc tính.listlà một chức năng buil-in để xây dựng một danh sách mới. Bạn nên viết các lớp tên với chữ in hoa.