質問
これは単純であるべきだと思われます:
が欲しい list
他のものと同じように list
, 、異なる点を除いて .__str__
方法。
- 設定しようとしています
object.__str__ = foo
読み取り専用エラーが発生する - サブクラス化しようとしています
list
既存のものを変換する何らかの方法が必要であることを意味しますlist
サブクラスのインスタンスに。これには、すべての属性を手動でコピーするか (非常に面倒)、何らかの方法ですべてを自動的にコピーする必要がありますが、その方法がわかりません。 - の周りにラッパーを書こうとしています
list
object は、ラップされたオブジェクトにすべてのメッセージを送信する方法を考え出す必要があることを意味します。.__str__
独自の方法で対応させていただいております。やり方がわかりません。
代替案、または解決策 #2 または #3 をいただければ幸いです。ありがとう!
解決
このソリューションは、ラッパーなしで動作します。アドインにより、二つのリストを結合する場合と動作します。予想通り、リスト自体を変更する操作が動作します。以下のようなリストのコピーを返す関数のみ:ソート、罰金であるネイティブのPythonのリストを返しますreveresed。一方でソートし、逆リスト自体を操作すると型を維持します。
class myList(list):
def __new__(cls, data=None):
obj = super(myList, cls).__new__(cls, data)
return obj
def __str__(self):
return 'myList(%s)' % list(self)
def __add__(self, other):
return myList(list(self) + list(other))
>>> l = myList(range(5))
>>> print l
myList([0, 1, 2, 3, 4])
>>> print l + [1, 2]
myList([0, 1, 2, 3, 4, 1, 2])
>>> l.sort()
>>> print l
myList([0, 1, 2, 3, 4])
他のヒント
あなたは他のコンテナ(例えば、__str__
)についてtuple
を上書きしたい場合は、多重継承を利用することができます:
class PrettyStr(object):
def __str__(self):
ret = ''
if isinstance(self, (list, tuple)):
ret = ''.join(str(elem) for elem in self)
else:
pass # handle other types here
return ret
class MyList(PrettyStr, list):
pass
class MyTuple(PrettyStr, tuple):
pass
if __name__ == "__main__":
print MyList([1, 2, 3, 4])
print MyTuple((1, 2, 3, 4))
あなたは、リストクラスを拡張し、それをオーバーライドすることができます:
class myList(list):
def __str__(self):
# do something
return "something"
編集:Pythonのリストの実装で許可されていないリストオブジェクト、上__str__
を置き換える動的に提案答えの間違った部分を削除
私は、Javaプログラマが、私はそれはあなたが望むものだと思います(のpython 2.6でテスト):
>>> class myList(list):
... def __str__(self):
... return "aaa"
...
>>> def myListWrapper(list):
... return myList(list)
...
>>> a = [1, 2, 3]
>>> type(a)
<type 'list'>
>>> b = myListWrapper(a)
>>> type(b)
<class '__main__.myList'>
>>> print(a)
[1, 2, 3]
>>> print(b)
aaa
class MyList(list):
def __str__(self):
return "foo"
str(MyList([1, 2, 3]))
'FOO'
str(MyList(list([1, 2, 3])))
'FOO'
答えとして私の以前のコメント。あなたはMYLISTはそのコンストラクタ内の任意の順序を受け入れる見ることができるようにます。
問題提起どちら:?なぜあなたは__str__メソッドをオーバーライドしたいですが。
それはあなたのオブジェクトをカプセル化するクラスを作成した方がよいwouldntの?
class MyContainer(object):
def __init__(self, list):
self.containedList = list
def __str__(self):
print('All hail Python')
あなたがオブジェクトを変換、または属性をコピーする、または全く心配する必要はありませんこの方法です。 (ところで、それはインテリジェントなコピー、または「のは、反復可能で、リストオブジェクトを再作成しましょう?」馬鹿ですか?(LONGLIST)マイリストどのように高価である)
いくつかの点で、それはあなたが何をしようとして行うには複雑に見えます、場合、それはあなたが、それは間違ってやっていることを意味するかもしれません:P
どのようにリストを包むでしょうか?
>>> class StrList(object):
def __init__(self, data=None):
self._data = data or []
def __str__(self):
return "StrList!"
def __getattr__(self, attr):
if attr == "_data":
return self.__dict__[attr]
return getattr(self._data, attr)
def __setattr__(self, key, val):
if key == "_data":
self.__dict__[key] = val
else:
setattr(self._data, key, val)
def __getitem__(self, index):
return self._data[index]
def __setitem__(self, index, value):
self._data[index] = value
>>> l = StrList(range(3))
>>> print l
StrList!
>>> l[0]
0
>>> for x in l:
print x
0
1
2
>>> l[0] = "spam"
>>> l.append("egg")
>>> print list(l)
['spam', 1, 2, 'egg']
>>>
Ex = ["a", 2, 4] #our_list
Ex(-1) = "xuxu_beleza" #the_name_of_your_list(index) = new_item
Print(Ex)
["a", 2, "xuxu_beleza"] #our_new_list
**list[index] = new_item**