估计是我问题没有描述清楚,这样吧,直接上代码:
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" method", __str__
의 경우 "dunder string"으로 발음할 수 있습니다.
아래 댓글로 질문하신 내용에 답변해드리겠습니다.
우선 혼동하지 마세요. 우리가 사용하는
인쇄 내용은 모두 문자열 print
이지만, 을 보면 실제로는 입니다. 여러 데이터 유형(또는 우리가 재정의한 클래스[1, 2]
)은 데이터 유형의 특성을 가진 문자열을 출력하는 방법을 찾을 것입니다(보통 이러한 데이터를 생성할 때 사용하는 "리터럴"에 매우 가깝습니다). '[1, 2]'
__str__
예를 들어 리터럴을 사용하여 목록을 생성합니다.
으아아아
lst
그래서 여기서
str(list)
둘째, Python 셸(Python의 대화형 인터페이스)에서 변수 이름만 사용하여
만으로는 충분하지 않으며 Mylist
:__str__
을 재정의해야 합니다.
으아아아
__repr__
: 으아아아
迷茫2017-04-17 17:45:30
print 함수는 객체의 __str__ 메서드를 호출합니다. __str__ 메서드를 직접 다시 구현하지 않은 경우 기본적으로 상위 클래스에서 상속된 __str__ 메서드가 사용되므로 출력이 반드시 다음 형식일 필요는 없습니다. .
으아악