我有一个班级(dict
的列表),我希望它自行排序:
class Table(list):
…
def sort (self, in_col_name):
self = Table(sorted(self, key=lambda x: x[in_col_name]))
但它根本不起作用。为什么?怎么避免呢?除了在外部进行排序外,例如:
new_table = Table(sorted(old_table, key=lambda x: x['col_name'])
是不是可以操纵对象本身?拥有:
更有意义class Table(list):
pass
比:
class Table(object):
l = []
…
def sort (self, in_col_name):
self.l = sorted(self.l, key=lambda x: x[in_col_name])
我认为,这是有效的。
一般来说,Python中没有任何方式,对象能够自行更改(不仅仅是实例变量)?
答案 0 :(得分:16)
您无法从方法中重新分配给self
,并希望它更改对象的外部引用。
self
只是传递给你的函数的参数。它是一个名称,指向调用该方法的实例。 “分配给self
”等同于:
def fn(a):
a = 2
a = 1
fn(a)
# a is still equal to 1
分配到self
会更改self
名称指向的内容(从一个Table
实例到此处的新Table
实例)。但就是这样。它只是更改名称(在您的方法范围内),并且不会影响基础对象,也不会影响指向它的其他名称(引用)。
使用list.sort
进行排序:
def sort(self, in_col_name):
super(Table, self).sort(key=lambda x: x[in_col_name])
答案 1 :(得分:2)
Python总是按值传递。这意味着分配参数永远不会对函数外部产生影响。 self
只是您为其中一个参数选择的名称。
答案 2 :(得分:0)
我被这个问题所吸引,因为我从来没有想过这个。我查找了list.sort
代码,看看它是如何完成的,但apparently it's in C。我想我知道你在哪里;如果没有super
方法可以调用怎么办?然后你可以做这样的事情:
class Table(list):
def pop_n(self, n):
for _ in range(n):
self.pop()
>>> a = Table(range(10))
>>> a.pop_n(3)
>>> print a
[0, 1, 2, 3, 4, 5, 6]
您可以调用self
的方法,对self
进行索引分配,并在其类中(或您implement yourself)执行其他任何操作。