検索

ホームページ  >  に質問  >  本文

在python中自己写的数据类型使用print无法输出每个元素

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

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中文网2803日前1378

全員に返信(4)返信します

  • PHP中文网

    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)

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

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

    結果: リーリー

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:45:30

    リーリー

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:45:30

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

    リーリー

    返事
    0
  • 迷茫

    迷茫2017-04-17 17:45:30

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

    リーリー

    返事
    0
  • キャンセル返事