Saya mencoba menerapkan fungsionalitas irisan untuk kelas yang saya buat yang membuat representasi vektor.
Saya memiliki kode ini sejauh ini, yang saya percaya akan mengimplementasikan slice dengan benar tetapi setiap kali saya melakukan panggilan seperti di v[4]
mana v adalah vektor python mengembalikan kesalahan karena tidak memiliki cukup parameter. Jadi saya mencoba mencari cara untuk menentukan getitem
metode khusus di kelas saya untuk menangani indeks biasa dan pemotongan.
def __getitem__(self, start, stop, step):
index = start
if stop == None:
end = start + 1
else:
end = stop
if step == None:
stride = 1
else:
stride = step
return self.__data[index:end:stride]
python
slice
python-datamodel
nikotin
sumber
sumber
__getslice__
untuk versi python 2.X. lihat docs.python.org/2/reference/datamodel.html#object.__getslice____get/set/delslice__
. Ini cukup halus.Saya memiliki daftar "sintetis" (yang datanya lebih besar daripada yang ingin Anda buat dalam memori) dan
__getitem__
tampilan saya seperti ini:Irisan tidak mengembalikan jenis yang sama, yang tidak-tidak, tetapi berhasil untuk saya.
sumber
Objek Slice dibuat secara otomatis saat Anda menggunakan titik dua dalam notasi subskrip - dan itulah yang diteruskan
__getitem__
. Gunakanisinstance
untuk memeriksa apakah Anda memiliki objek slice:Katakanlah kami menggunakan objek rentang, tetapi kami ingin irisan mengembalikan daftar daripada objek rentang baru (seperti yang dilakukannya):
Kami tidak dapat membuat rentang subkelas karena keterbatasan internal, tetapi kami dapat mendelegasikannya:
Kami tidak memiliki objek Range yang dapat diganti dengan sempurna, tetapi ini cukup dekat:
Untuk lebih memahami notasi slice, berikut contoh penggunaan Sliceable:
Python 2, perhatikan:
Di Python 2, ada metode usang yang mungkin perlu Anda ganti saat membuat subclass beberapa tipe bawaan.
Dari dokumentasi model data :
Ini hilang dengan Python 3.
sumber
Untuk memperluas jawaban Aaron, untuk hal-hal seperti
numpy
, Anda dapat melakukan pemotongan multi-dimensi dengan memeriksa apakahgiven
adalahtuple
:``
Keluaran:
sumber
Cara yang benar untuk melakukan ini adalah dengan
__getitem__
mengambil satu parameter, yang bisa berupa angka, atau objek potongan.Lihat:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
sumber