Nilai yang dikembalikan oleh kelas Python
Saya mencoba membuat kelas yang mengembalikan nilai, bukan diri sendiri.
Saya akan menunjukkan contoh perbandingan dengan sebuah daftar:
>>> l = list()
>>> print(l)
[]
>>> class MyClass:
>>> pass
>>> mc = MyClass()
>>> print mc
<__main__.MyClass instance at 0x02892508>
Saya perlu MyClass mengembalikan sebuah daftar, seperti yang dilakukan list()
, bukan info instance. Saya tahu bahwa saya bisa membuat subclass dari list. Tetapi apakah ada cara untuk melakukannya tanpa subclassing?
Saya ingin meniru sebuah daftar (atau objek lain):
>>> l1 = list()
>>> l2 = list()
>>> l1
[]
>>> l2
[]
>>> l1 == l2
True
>>> class MyClass():
def __repr__(self):
return '[]'
>>> m1 = MyClass()
>>> m2 = MyClass()
>>> m1
[]
>>> m2
[]
>>> m1 == m2
False
Mengapa m1 == m2
Salah? Ini pertanyaannya.
Saya minta maaf jika saya tidak menanggapi Anda semua. Saya mencoba semua solusi yang anda berikan kepada saya. Saya tidak bisa menggunakan def
, karena saya perlu menggunakan fungsi-fungsi seperti setitem, getitem, dll.
13
3
Saya pikir Anda sangat bingung tentang apa yang sedang terjadi.
Dalam Python, semuanya adalah objek:
[]
(sebuah daftar) adalah sebuah objek'abcde'
(sebuah string) adalah sebuah objek1
(sebuah bilangan bulat) adalah sebuah objekMyClass()
(sebuah instance) adalah sebuah objekMyClass
(sebuah kelas) juga merupakan sebuah objekDaftar
(sebuah tipe - seperti kelas) juga merupakan sebuah objekSemuanya adalah "values" dalam artian bahwa mereka adalah suatu hal dan bukan nama yang merujuk pada suatu hal. (Variabel adalah nama yang merujuk pada nilai.) Nilai bukanlah sesuatu yang berbeda dari objek dalam Python.
Ketika Anda memanggil objek kelas (seperti
MyClass()
ataulist()
), ia akan mengembalikan instance dari kelas tersebut. (list
sebenarnya adalah sebuah tipe dan bukan kelas, tapi saya sedikit menyederhanakan di sini).Ketika Anda print sebuah objek (yaitu mendapatkan representasi string dari sebuah objek), objek itu
__str__
atau__repr__
metode ajaib dipanggil dan nilai yang dikembalikan dicetak.Sebagai contoh:
Jadi apa yang Anda minta, "Saya perlu MyClass mengembalikan sebuah daftar, seperti list(), bukan info instance," tidak masuk akal.
list()
mengembalikan sebuah instance daftar.MyClass()
mengembalikan instance MyClass. Jika Anda menginginkan instance daftar, dapatkan saja instance daftar. Jika masalahnya adalah bagaimana objek-objek ini terlihat ketika Andamencetak
atau melihatnya di konsol, maka buatlah metode__str__
dan__repr__
yang merepresentasikannya seperti yang Anda inginkan untuk direpresentasikan.Update untuk pertanyaan baru tentang kesetaraan
Sekali lagi,
__str__
dan__repr__
hanya untuk printing, dan tidak mempengaruhi objek dengan cara lain. Hanya karena dua objek memiliki nilai__repr__
yang sama tidak berarti mereka sama!MyClass() != MyClass()
karena kelas Anda tidak mendefinisikan bagaimana ini akan sama, sehingga kembali ke perilaku default (dari tipeobjek
), yaitu bahwa objek hanya sama dengan dirinya sendiri:Jika Anda ingin mengubahnya, gunakan salah satu metode ajaib perbandingan
Sebagai contoh, Anda bisa memiliki objek yang sama dengan segalanya:
Saya pikir Anda harus melakukan dua hal:
Lihatlah panduan penggunaan metode ajaib di Python.
Justifikasi mengapa Anda tidak melakukan subclassing
list
jika apa yang Anda inginkan sangat mirip list. Jika subclassing tidak sesuai, Anda dapat mendelegasikan ke instance list yang dibungkus sebagai gantinya:Ini sekarang akan bertindak seperti daftar tanpa menjadi daftar (yaitu, tanpa subclassing
daftar
).Jika yang Anda inginkan adalah cara untuk mengubah kelas Anda menjadi semacam daftar tanpa mensubclassing
daftar
, maka buatlah sebuah method yang mengembalikan sebuah daftar:Jika yang Anda maksudkan adalah bahwa
print MyClass()
akan mencetak sebuah daftar, override saja__repr__
:EDIT: Saya lihat maksud Anda adalah bagaimana membuat objek membandingkan. Untuk itu, Anda menimpa metode
__cmp__
.Anda sedang mendeskripsikan sebuah fungsi, bukan kelas.