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

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

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级讲师

répondre à tous(4)
洪涛

Vous utilisez la méthode « agrégation » pour créer vos propres données de cluster. À l'heure actuelle, la délégation est une méthode simple :

class Mylist:
    def __init__(self):
        self._mylist=list()

    def __len__(self):
        return len(self._mylist)

    def add(self,value):
        return self._mylist.append(value)

    def __str__(self):
        return str(self._mylist)

__str__ est une méthode spéciale dans la classe Python. Sa valeur de retour est la valeur obtenue en utilisant str(x), et print(x) est en fait égale à print(str(x)). En fait, pour être plus détaillé, lorsque nous appelons str(x), nous appelons en fait x.__str__().

En d’autres termes, on peut l’imaginer ainsi :

print(x) === print(str(x)) === print(x.__str__())

Généralement, pour notre classe personnalisée, la valeur de retour de la méthode __str__ est la chaîne par défaut, par exemple : <__main__.Mylist object at 0x0071A470> est utilisé pour décrire l'espace de noms, le nom de la classe et l'emplacement. Si nous voulons modifier la valeur de retour de __str__, nous devons l'écraser.

Ici, nous laissons la valeur de retour de __str__ être la valeur MyList de la liste agrégée dans la classe __str__, de sorte que la sortie de __str__ soit la même que la liste par délégation.


Je voudrais ajouter que ce genre de méthode (communément appelée méthode magique ou méthode spéciale) qui commence par un double trait de soulignement et se termine par un double trait de soulignement dans une classe a un nom officiel appelé Méthode "dunder", pour __str__, on peut le prononcer comme "dunder string".

L'utilisation fréquente de doubles traits de soulignement dans les identifiants internes en Python a donné naissance à l'abréviation dunder ; elle a été inventée par Mark Jackson et indépendamment par Tim Hochberg, à quelques minutes d'intervalle, tous deux en réponse à la même question dans 2002. --wiki


Je répondrai aux questions posées dans les commentaires ci-dessous.

Tout d'abord, ne soyez pas confus. Le contenu imprimé que nous utilisons print est entièrement chaîne Même si vous voyez [1, 2], c'est en fait une chaîne '[1, 2]', mais c'est le cas. est intégré Plusieurs types de données (ou classes que nous avons remplacés __str__) trouveront un moyen de générer une chaîne avec les caractéristiques du type de données (généralement très proche du "littéral" que nous utilisons lors de la génération de ces données) .

Par exemple, nous utilisons des littéraux pour générer une liste :

lst = [1, 2]

Lorsque nous imprimons lst, Python créera une chaîne qui ressemble au type de données littéral (ou même exactement le même) que vous pourrez imprimer.

print(lst)

[1, 2] # 其實這是個字串,但是 lst 還是 list!

Donc ici str(list) ne change pas le type des éléments de la liste, mais utilise uniquement la "string" avec ses caractéristiques comme valeur de retour.

Deuxièmement, si vous souhaitez afficher la chaîne représentant Mylist en utilisant uniquement le nom de la variable dans le shell Python (l'interface interactive de Python), __str__ seul ne suffit pas, vous devez remplacer __repr__:

class Mylist:

    def __init__(self):
        self._mylist=list()

    def __len__(self):
        return len(self._mylist)

    def add(self,value):
        return self._mylist.append(value)

    def __str__(self):
        return str(self._mylist)
        
    def __repr__(self):
        return str(self)

Résultat :

\>>> from test import Mylist
\>>> lst = Mylist()
\>>> lst.add(1)
\>>> lst.add(2)
\>>> lst
[1, 2]
洪涛
__str__
大家讲道理

Implémentez la fonction __str__ dans la classe et écrivez le contenu que vous souhaitez afficher
Par exemple

class Mylist(object):
    def __str__(self):
        return "This is my list"
 
mylist = Mylist()
print mylist
迷茫

La fonction print appellera la méthode __str__ de l'objet. Si vous n'avez pas réimplémenté la méthode __str__ vous-même, la méthode __str__ héritée de la classe parent sera utilisée par défaut, donc la sortie n'est pas nécessairement sous la forme d'une liste.

class MyList(list):
    pass
    
print MyList()    # []
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal