估计是我问题没有描述清楚,这样吧,直接上代码:
class Mylist:
def __init__(self):
self._mylist=list()
def __len__(self):
return len(self._mylist)
def add(self,value):
return self._mylist.append(value)
我自己模仿list的行为。写了一个基本的list,名字叫Mylist,并给他一个add方法用来添加其中的元素,添加完之后,我想输出其中的内容,然后我使用:
list1=Mylist()
list1.add(1)
list1.add(2)
print(list1)
我以为print会显示出list1中的每一项,但是发现实际没有,显示的为:
<__main__.Mylist object at 0x0071A470>
怎么样能让print(list1)显示出的结果和真实list类型一样呢?例如:
[1,2]
__str__具体怎么实现,貌似这个只能为str类型,int不行,而且我发现在pycharm 里面写的时候,提示__str__方法“overrides method in object”
PHP中文网2017-04-17 17:45:30
現時点では、「集約」メソッドを使用して独自のクラスター データを作成しています。
現時点では、委任は単純なメソッドです。 リーリー__str__
は Python クラスの特別なメソッドであり、その戻り値は str(x)
を使用して取得された値であり、print(x)
は実際には print(str(x))
と同じです。実際、より詳しく言うと、str(x)
を呼び出すとき、実際には x.__str__()
を呼び出します。
言い換えると、次のように想像できます:
print(x)
===print(str(x))
===print(x.__str__())
一般に、カスタマイズされたクラスの場合、__str__
メソッドの戻り値はデフォルトの文字列です。たとえば、<__main__.Mylist object at 0x0071A470>
は、名前空間、クラス名、および場所を記述するために使用されます。 __str__
の戻り値を変更したい場合は、それを上書きする必要があります。
ここでは、__str__
の戻り値を MyList
クラスに集約されたリストの __str__
値にすることで、__str__
の出力が委任によるリストと同じになるようにします。
クラス 内の二重下線で始まり二重下線 で終わるこの種のメソッド (一般にマジック メソッドまたは特殊メソッドと呼ばれる) は、 という正式名があることを付け加えておきます。 🎜> "dunder" メソッド"、__str__
については、「ダンダー ストリング」と発音できます。
Python の内部識別子で二重アンダースコアが頻繁に使用されるため、ダンダーという略語が生まれました。これは、Mark Jackson と Tim Hochberg がそれぞれ数分以内に独自に作ったもので、どちらも同じ質問への回答でした。 2002. --wiki
以下のコメントでいただいたご質問にお答えします。
まず、混乱しないでください。print
で使用する印刷コンテンツはすべて 文字列 ですが、実際には [1, 2]
です。は組み込みです。 いくつかのデータ型 (または '[1, 2]'
をオーバーライドしたクラス) は、データ型の特性を持つ文字列を出力する方法を見つけます (通常、これらのデータを生成するときに使用する「リテラル」に非常に近い) . __str__
リーリー
を出力すると、Python はデータ型リテラルに似た (またはまったく同じ) 文字列を作成して出力します。 lst
リーリー
はリスト内の要素の型を変更せず、その特性を持つ「文字列」を戻り値として使用するだけです。 str(list)
を表す文字列を表示したい場合は、Mylist
だけでは十分ではなく、__str__
:__repr__
をオーバーライドする必要があります。
リーリー
結果: リーリー
迷茫2017-04-17 17:45:30
print 関数はオブジェクトの __str__ メソッドを呼び出します。__str__ メソッドを自分で再実装していない場合は、親クラスから継承された __str__ メソッドがデフォルトで使用されるため、出力は必ずしも次の形式になるわけではありません。リストの。
リーリー