Valore restituito dalla classe Python

2022-07-29 11:30:13

Sto cercando di creare una classe che restituisca un valore, non self.

Ti mostrerò un esempio di confronto con un elenco:

>>> l = list()
>>> print(l)
[]
>>> class MyClass:
>>>     pass

>>> mc = MyClass()
>>> print mc
<__main__.MyClass instance at 0x02892508>

Ho bisogno che MyClass restituisca un elenco, come fa list(), non le informazioni sull'istanza. So che posso creare una sottoclasse di list. Ma c'è un modo per farlo senza sottoclassi?

Voglio imitare una lista (o altri oggetti):

>>> l1 = list()
>>> l2 = list()
>>> l1
[]
>>> l2
[]
>>> l1 == l2
True
>>> class MyClass():
def __repr__(self):
    return '[]'


>>> m1 = MyClass()
>>> m2 = MyClass()
>>> m1
[]
>>> m2
[]
>>> m1 == m2
False

Perché m1 == m2 è falso? Questa è la domanda.

Mi dispiace se non rispondo a tutti voi. Sto provando tutte le soluzioni che mi dai. Non posso usare def, perché ho bisogno di usare funzioni come setitem, getitem, ecc.

- Harry Hache

Source
Risposta


32
  • Se quello che vuoi è un modo per trasformare la tua classe in una specie di elenco senza sottoclassi list, allora crea un metodo che restituisca una lista:

    def MyClass():
        def __init__(self):
            self.value1 = 1
            self.value2 = 2
    
        def get_list(self):
            return [self.value1, self.value2...]
    
    
    >>>print MyClass().get_list()
    [1, 2...]
    

    Se intendevi che print MyClass() stamperà un elenco, sostituisci semplicemente __repr__:

    class MyClass():        
        def __init__(self):
            self.value1 = 1
            self.value2 = 2
    
        def __repr__(self):
            return repr([self.value1, self.value2])
    

    MODIFICA: Vedo che intendevi come creare oggetti confronti. Per questo, sostituisci il metodo __cmp__.

    class MyClass():
        def __cmp__(self, other):
            return cmp(self.get_list(), other.get_list())