I have a class (list of dict
s) and I want it to sort itself:
class Table(list):
…
def sort (self, in_col_name):
self = Table(sorted(self, key=lambda x: x[in_col_name]))
but it doesn't work at all. Why? How to avoid it? Except for sorting it externally, like:
new_table = Table(sorted(old_table, key=lambda x: x['col_name'])
Isn't it possible to manipulate the object itself? It's more meaningful to have:
class Table(list):
pass
than:
class Table(object):
l = []
…
def sort (self, in_col_name):
self.l = sorted(self.l, key=lambda x: x[in_col_name])
which, I think, works. And in general, isn't there any way in Python which an object is able to change itself (not only an instance variable)?
You can't re-assign to self
from within a method and expect it to change external references to the object.
self
is just an argument that is passed to your function. It's a name that points to the instance the method was called on. "Assigning to self
" is equivalent to:
def fn(a):
a = 2
a = 1
fn(a)
# a is still equal to 1
Assigning to self
changes what the self
name points to (from one Table
instance to a new Table
instance here). But that's it. It just changes the name (in the scope of your method), and does affect not the underlying object, nor other names (references) that point to it.
Just sort in place using list.sort
:
def sort(self, in_col_name):
super(Table, self).sort(key=lambda x: x[in_col_name])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With