Maison > Questions et réponses > le corps du texte
估计是我问题没有描述清楚,这样吧,直接上代码:
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
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]
大家讲道理2017-04-17 17:45:30
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
迷茫2017-04-17 17:45:30
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() # []