문제

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

업데이트

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

도움이 되었습니까?

해결책

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

Python의 프로토콜은 길이가있는 객체 에서이 방법을 구현하고 내장을 사용하는 것입니다. len() 당신이 구현하는 방식과 유사하게 당신을 위해 그것을 부르는 함수 __iter__() 그리고 내장을 사용하십시오 iter() 반복 할 수있는 물체에서 기능 (또는 무대 뒤에서 메소드를 호출하십시오).

보다 컨테이너 유형 에뮬레이션 자세한 내용은.

Python의 프로토콜 주제에 대한 좋은 읽기는 다음과 같습니다. 파이썬과 최소 놀랍게도 원리

다른 팁

짐의 대답 이 질문 도움이 될 수 있습니다. 나는 그것을 여기에 복사한다. Guido van Rossum 인용 :

우선, 나는 HCI 이유로 X.len ()보다 Len (x)을 선택했습니다 (def __len __ ()는 훨씬 나중에 왔습니다). 실제로 얽힌 두 가지 이유가 있습니다. HCI는 모두 다음과 같습니다.

(a) 일부 작업의 경우, 접두사 표기법은 PostFix보다 더 잘 읽습니다. Prefix (및 Infix!) 작업은 수학에서 오랜 전통을 가지고 있으며, 이는 비주얼이 문제에 대한 수학자의 생각에 도움이되는 표기법을 좋아합니다. x*(a+b)와 같은 공식을 x로 다시 작성하는 쉬운 비교a + xb 원시 OO 표기법을 사용하여 동일한 일을하는 서투름에.

(b) len (x)이라는 코드를 읽을 때 나는 그것이 무언가의 길이를 요구하고 있음을 알고 있습니다. 이것은 두 가지를 알려줍니다. 결과는 정수이며 논증은 일종의 용기입니다. 반대로, x.len ()을 읽을 때 X는 인터페이스를 구현하거나 표준 LEN ()이있는 클래스에서 상속하는 일종의 컨테이너라는 것을 이미 알아야합니다. 매핑을 구현하지 않는 클래스에 get () 또는 keys () 메소드가 있거나 파일에 쓰기 () 메소드가있는 경우 가끔 혼란을 목격하십시오.

다른 방식으로 같은 것을 말하면서 나는 'Len'을 내장 작업으로 본다. 나는 그것을 잃는 것을 싫어합니다. /…/

이있다 len 방법:

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

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

그만큼 len() 내장 기능은 내장 유형을 직접 처리합니다. CPYTHON 구현 len() 실제로 값을 반환합니다 ob_size 필드 PyVarObject C 구조 이는 메모리의 가변 크기 내장 객체를 나타냅니다. 이것은 많이 메소드를 호출하는 것보다 빠릅니다. 속성 조회가 발생할 필요가 없습니다. 컬렉션에서 품목 수를 얻는 것은 일반적인 작업이며 str, list, array.array 등.

그러나 적용 할 때 일관성을 높이기 위해 len(o) 사용자 정의 유형으로 파이썬이 호출됩니다 o.__len__() 폴백으로. __len__, __abs__ 그리고 다른 모든 특별한 방법은 파이썬 데이터 모델 내장과 같이 행동하는 객체를 쉽게 만들 수 있도록 표현적이고 매우 일관된 API를 "Pythonic"이라고합니다.

특수 메소드를 구현함으로써 객체는 반복, 과부하 디픽스 연산자, 컨텍스트 관리를 지원할 수 있습니다. with 블록 등은 데이터 모델을 파이썬 언어 자체를 생성 한 객체를 원활하게 통합 할 수있는 프레임 워크로 사용하는 방법으로 생각할 수 있습니다.

두 번째 이유는 Guido van Rossum의 인용문으로 뒷받침됩니다. 이 하나, 읽고 쓰는 것이 더 쉽다는 것입니다. len(s) ~보다 s.len().

표기법 len(s) 접두사 표기법이있는 단일 연산자와 일치합니다. abs(n). len() 보다 자주 사용됩니다 abs(), 그리고 글을 쉽게 작성하기 쉽습니다.

역사적 이유가있을 수 있습니다. Python 이전에 (그리고 디자인에 매우 영향력이 있었음) 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.

여기에는 몇 가지 큰 대답이 있습니다. 그래서 내 자신을주기 전에 몇 가지 보석 (루비의 의도가 없음)을 강조하고 싶습니다.

  • Python은 순수한 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.

그렇지 않습니까?

>>> "abc".__len__()
3
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top