私は、Pythonのリストの非常にシンプルでストレートなサブクラスだと思っています。Pythonでリストをサブクラス化する。スライスと空のリストが機能しないのはなぜですか?
リストのすべての機能を使いたいとします。私はいくつかのメソッドをリストのデフォルトセットに追加したいと思います。
次は一例です。
class Mylist(list):
def cm1(self):
self[0]=10
def cm2(self):
for i,v in enumerate(self):
self[i]=self[i]+10
def cm3(self):
self=[]
def cm4(self):
self=self[::-1]
def cm5(self):
self=[1,2,3,4,5]
ml=Mylist([1,2,3,4])
ml.append(5)
print "ml, an instance of Mylist: ",ml
ml.cm1()
print "cm1() works: ",ml
ml.cm2()
print "cm2() works: ",ml
ml.cm3()
print "cm3() does NOT work as expected: ",ml
ml.cm4()
print "cm4() does NOT work as expected: ",ml
ml.cm5()
print "cm5() does NOT work as expected: ",ml
出力:
Mylist: [1, 2, 3, 4, 5]
cm1() works: [10, 2, 3, 4, 5]
cm2() works: [20, 12, 13, 14, 15]
cm3() does NOT work as expected: [20, 12, 13, 14, 15]
cm4() does NOT work as expected: [20, 12, 13, 14, 15]
cm5() does NOT work as expected: [20, 12, 13, 14, 15]
だから、私が期待し、理解とスカラー割り当てが機能しているようです。リストやスライスがわかりません。 「うまくいかない」とは、メソッドのコードが最初の2つのメソッドのようにmlのインスタンスを変更しないことを意味します。
cm3()
cm4()
とcm5()
が機能するにはどうすればよいですか?
それはリストに固有ではありません。これは、名前と代入がPythonでどのように動作するかということです。代入は名前を再バインドし、名前が現在バインドされているオブジェクトを変更することはありません。 –
@Cat Plus Plus:はい、私はそれを疑って理解しています。確かに、サブクラス化されたリストの再割り当てやスライス構文の使用は可能ですか?私はちょうどゴーグルやPythonのドキュメントをどのように見つけられないのかわかりません。私はまだPythonクラスで少し緑色です... – dawg
「再割り当て」が意味するものに依存します。 –