J'essaie d'implémenter la fonctionnalité de tranche pour une classe que je crée qui crée une représentation vectorielle.
J'ai ce code jusqu'à présent, qui, je pense, implémentera correctement la tranche, mais chaque fois que je fais un appel comme v[4]
où v est un vecteur, python renvoie une erreur concernant le manque de paramètres. J'essaie donc de comprendre comment définir la getitem
méthode spéciale dans ma classe pour gérer à la fois les index simples et le découpage.
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
nicotine
la source
la source
__getslice__
versions de python 2.X. voir docs.python.org/2/reference/datamodel.html#object.__getslice____get/set/delslice__
. C'est assez subtil, cependant.J'ai une liste "synthétique" (une où les données sont plus grandes que vous voudriez créer en mémoire) et mon
__getitem__
ressemble à ceci:La tranche ne renvoie pas le même type, ce qui est un non-non, mais cela fonctionne pour moi.
la source
Les objets Slice sont automatiquement créés lorsque vous utilisez un signe deux-points dans la notation en indice - et c'est ce à quoi est passé
__getitem__
. Utilisezisinstance
pour vérifier si vous avez un objet tranche:Supposons que nous utilisions un objet range, mais que nous souhaitons que les tranches renvoient des listes au lieu de nouveaux objets range (comme c'est le cas):
Nous ne pouvons pas sous-classer range en raison de limitations internes, mais nous pouvons lui déléguer:
Nous n'avons pas d'objet Range parfaitement remplaçable, mais c'est assez proche:
Pour mieux comprendre la notation de tranche, voici un exemple d'utilisation de Sliceable:
Python 2, soyez conscient:
Dans Python 2, il existe une méthode obsolète que vous devrez peut-être remplacer lors du sous-classement de certains types intégrés.
À partir de la documentation du modèle de données :
Cela a disparu dans Python 3.
la source
Pour étendre la réponse d'Aaron, pour des choses comme
numpy
, vous pouvez effectuer un découpage multidimensionnel en vérifiant sigiven
est untuple
:''
Production:
la source
La bonne façon de procéder consiste à
__getitem__
prendre un paramètre, qui peut être un nombre ou un objet de tranche.Voir:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
la source