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
temp
là 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.temp
làm việc như mong đợi nhưng làm thế quái nào A.temp
là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 A
lớ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 A
lớ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 temp
thuộc tính được liệt kê trong số các A
thuộ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.temp
nế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 change
phươ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.
list
như một tên thuộc tính.list
là 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.