[python] 왜 파이썬 코드가 길이 메소드 대신 len () 함수를 사용합니까?

파이썬에는 len()문자열의 크기를 결정하는 데 사용되는 함수 가 있다는 것을 알고 있지만 왜 문자열 객체의 메소드가 아닌지 궁금합니다.

최신 정보

좋아, 나는 내가 당혹스럽게 착각했다는 것을 깨달았다. __len__()실제로는 문자열 객체의 메서드입니다. 문자열 객체에서 len 함수를 사용하여 파이썬에서 객체 지향 코드를 보는 것이 이상하게 보입니다. 또한 __len__len 대신 이름 으로 보는 것도 이상합니다 .



답변

문자열에는 길이 방법이 있습니다. __len__()

파이썬에서의 프로토콜은 길이와 사용 목적에이 방법을 구현하는 것입니다 내장 len()당신이 구현하는 방법과 유사 당신을 위해 그것을 호출 기능, __iter__()그리고 사용하는 내장 iter()기능 (또는 뒤에라는 방법을 반복 가능한 객체에 대한 장면).

자세한 내용은 컨테이너 유형 에뮬레이션 을 참조하십시오.

다음은 파이썬에서 프로토콜의 주제에 대해 잘 읽은 것입니다 : 파이썬과 최소한의 놀라움의 원리


답변

이 질문에 대한 Jim의 답변 도움 될 수 있습니다. 여기에 복사합니다. Quoing Guido van Rossum :

우선, HCI 이유로 x.len () 대신 len (x)를 선택했습니다 (def __len __ ()이 훨씬 늦음). 실제로 HCI에는 두 가지 이유가 있습니다.

(a) 일부 연산의 경우 접두사 표기법은 접두사보다 더 잘 읽습니다. 접두사 (및 접두사!) 연산은 수학에서 시각이 수학자가 문제에 대해 생각하는 데 도움이되는 표기법을 좋아하는 오랜 전통을 가지고 있습니다. x * (a + b)와 같은 공식을 x a + x 로 쉽게 재 작성하는 것과 비교 b로 원시 OO 표기법을 사용하여 같은 일을하는 어색함을 비교하십시오.

(b) len (x)라는 코드를 읽을 때 무언가 길이를 요구한다는 것을 알고 있습니다. 이것은 두 가지를 말해줍니다. 결과는 정수이고 인수는 일종의 컨테이너입니다. 반대로 x.len ()을 읽을 때 x는 인터페이스를 구현하거나 표준 len ()이있는 클래스에서 상속되는 일종의 컨테이너라는 것을 이미 알고 있어야합니다. 맵핑을 구현하지 않는 클래스에 get () 또는 keys () 메소드가 있거나 파일이 아닌 클래스에 write () 메소드가있는 경우 때때로 혼란을 목격하십시오.

다른 방법으로 같은 것을 말하면 ‘len’이 내장 된 작업으로 간주됩니다. 나는 그것을 잃는 것을 싫어한다. /… /


답변

이있다 len 방법은 :

>>> a = 'a string of some length'
>>> a.__len__()
23
>>> a.__len__
<method-wrapper '__len__' of str object at 0x02005650>


답변

파이썬은 실용적인 프로그래밍 언어이며, 그 이유 len()기능이 아닌 방법 인 str, list,dict 등 는 실용적입니다.

len()내장 기능 상품의 직접와 내장 유형 :의 CPython의 구현 len()실제로는의 값 반환 ob_size필드 PyVarObjectC 구조체 나타내고있는 가변 크기의 내장 메모리에 객체입니다. 이것은 메서드를 호출하는 것보다 훨씬 빠릅니다. 속성 조회가 필요하지 않습니다. 컬렉션의 항목 수를 얻기 일반적인 작업입니다 및 기본 및 다양한 유형으로 효율적으로 일해야한다 str, list,array.array

그러나 일관성을 높이기 위해 len(o)사용자 정의 형식에 적용 할 때 Python o.__len__()은 폴백으로 호출 합니다. __len__, __abs__에 설명 된 모든 다른 특별한 방법 파이썬 데이터 모델은 쉽게 그 내장 기능처럼 작동, 우리가 “파이썬”이라고 부르는 표현과 매우 일관된 API를 가능 객체를 생성 할 수 있습니다.

특수 메소드를 구현하면 객체가 반복을 지원하고, 삽입 연산자를 오버로드하고, with블록 에서 컨텍스트를 관리 할 수 있습니다. Python 모델 자체를 생성 한 객체를 완벽하게 통합 할 수있는 프레임 워크로 사용하는 방법으로 데이터 모델을 생각할 수 있습니다.

같은 귀도 반 로섬 (Guido van Rossum)에서 따옴표가 지원하는 두 번째 이유는, 이 하나 , 읽기 및 쓰기 쉽다 것입니다 len(s)보다 s.len().

이 표기법 len(s)은 다음과 같이 접두사 표기법이있는 단항 연산자와 일치 abs(n)합니다. len()보다 자주 abs()사용되며 작성하기 쉬워야합니다.

역사적인 이유가있을 수도 있습니다. 파이썬에 앞서 ABC 언어에 (그리고 디자인에 매우 영향력이있는), 단항 연산자가 #s의미하는 대로 작성되었습니다 len(s).


답변

met% python -c 'import this' | grep 'only one'
There should be one-- and preferably only one --obvious way to do it.


답변

여기에 큰 대답이 있습니다. 그래서 내가 직접하기 전에 여기에서 읽은 몇 가지 보석 (루비 찌르지 않음)을 강조하고 싶습니다.

  • 파이썬은 순수한 OOP 언어가 아닙니다. 프로그래머가 가장 편한 패러다임 및 / 또는 자신의 솔루션에 가장 적합한 패러다임을 사용할 수 있도록하는 범용 멀티 패러다임 언어입니다.
  • 파이썬은 일급 함수를 가지고 있으므로 len실제로 객체입니다. 반면에 루비에는 퍼스트 클래스 기능이 없습니다. 따라서 len함수 객체에는를 실행하여 검사 할 수있는 자체 메소드가 있습니다 dir(len).

자신의 코드에서 이것이 작동하는 방식이 마음에 들지 않으면 원하는 방법을 사용하여 컨테이너를 다시 구현하는 것이 간단합니다 (아래 예 참조).

>>> class List(list):
...     def len(self):
...         return len(self)
...
>>> class Dict(dict):
...     def len(self):
...         return len(self)
...
>>> class Tuple(tuple):
...     def len(self):
...         return len(self)
...
>>> class Set(set):
...     def len(self):
...         return len(self)
...
>>> my_list = List([1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'])
>>> my_dict = Dict({'key': 'value', 'site': 'stackoverflow'})
>>> my_set = Set({1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'})
>>> my_tuple = Tuple((1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'))
>>> my_containers = Tuple((my_list, my_dict, my_set, my_tuple))
>>>
>>> for container in my_containers:
...     print container.len()
...
15
2
15
15


답변

당신은 또한 말할 수 있습니다

>> x = 'test'
>> len(x)
4

파이썬 사용하기 2.7.3.