Meskipun jawaban yang diterima tepat, saya ingin menambahkan sedikit deskripsi.
Mari kita lakukan latihan kecil
pertama-tama tentukan kelas sebagai berikut:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
Jadi apa yang kita miliki di sini?
- Kami memiliki kelas yang sangat sederhana yang memiliki atribut
temp
yang berupa string
- Sebuah
__init__
metode yang setself.x
- Set metode perubahan
self.temp
Cukup lurus ke depan sejauh ini ya? Sekarang mari kita mulai bermain-main dengan kelas ini. Mari kita inisialisasi kelas ini terlebih dahulu:
a = A('Tesseract')
Sekarang lakukan hal berikut:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
Yah, a.temp
bekerja seperti yang diharapkan tetapi bagaimana sih itu A.temp
bekerja? Yah itu berhasil karena temp adalah atribut kelas. Segala sesuatu di python adalah objek. Di sini A juga merupakan objek kelas type
. Dengan demikian atribut temp adalah atribut yang dimiliki oleh A
kelas dan jika Anda mengubah nilai temp melalui A
(dan bukan melalui turunan dari a
), nilai yang diubah akan tercermin dalam semua turunan A
kelas. Ayo maju dan lakukan itu:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
Menarik bukan? Dan perhatikan itu id(a.temp)
dan id(A.temp)
masih sama .
Setiap objek Python secara otomatis diberikan __dict__
atribut, yang berisi daftar atributnya. Mari selidiki apa isi kamus ini untuk objek contoh kami:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
Perhatikan bahwa temp
atribut terdaftar di antara A
atribut kelas sementara x
terdaftar untuk instance.
Jadi bagaimana bisa kita mendapatkan nilai yang ditentukan a.temp
jika bahkan tidak terdaftar sebagai contoh a
. Nah itulah keajaiban __getattribute__()
metode. Dalam Python sintaksis putus-putus secara otomatis memanggil metode ini sehingga ketika kita menulis a.temp
, Python mengeksekusi a.__getattribute__('temp')
. Metode itu melakukan tindakan pencarian atribut, yaitu menemukan nilai atribut dengan melihat di tempat yang berbeda.
Implementasi standar __getattribute__()
pencarian pertama kamus internal ( dikt ) dari suatu objek, kemudian jenis objek itu sendiri. Dalam hal ini a.__getattribute__('temp')
dijalankan pertama a.__dict__['temp']
dan kemudiana.__class__.__dict__['temp']
Oke sekarang mari kita gunakan change
metode kami :
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
Nah sekarang kita telah menggunakan self
, print(a.temp)
memberi kita nilai berbeda print(A.temp)
.
Sekarang jika kita membandingkan id(a.temp)
dan id(A.temp)
, mereka akan berbeda.
list
sebagai nama atribut.list
adalah fungsi buil-in untuk membangun daftar baru. Anda harus menulis kelas nama dengan huruf besar.