在python中自己写的数据类型使用print无法输出每个元素
PHP中文网
PHP中文网 2017-04-17 17:43:30
0
4
1386

估计是我问题没有描述清楚,这样吧,直接上代码:

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中文网
PHP中文网

认证0级讲师

全員に返信(4)
洪涛

現時点では、「集約」メソッドを使用して独自のクラスター データを作成しています。

現時点では、委任は単純なメソッドです。 リーリー

__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)

次に、Python シェル (Python の対話型インターフェイス) で変数名のみを使用して

を表す文字列を表示したい場合は、Mylist だけでは十分ではなく、__str__:__repr__ をオーバーライドする必要があります。 リーリー

結果: リーリー

いいねを押す +0
洪涛

リーリー

いいねを押す +0
大家讲道理

クラスに__str__関数を実装し、出力したい内容を記述します
例えば

リーリー
いいねを押す +0
迷茫

print 関数はオブジェクトの __str__ メソッドを呼び出します。__str__ メソッドを自分で再実装していない場合は、親クラスから継承された __str__ メソッドがデフォルトで使用されるため、出力は必ずしも次の形式になるわけではありません。リストの。

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート