len ()과 .__ len __ ()의 차이점은 무엇입니까?
len([1,2,3])
또는 호출 사이에 차이가 [1,2,3].__len__()
있습니까?
눈에 띄는 차이가 없다면 무대 뒤에서 다르게 수행되는 것은 무엇입니까?
len
컬렉션의 길이를 구하는 함수입니다. 개체의 __len__
메서드 를 호출하여 작동합니다 . __something__
속성은 특별하고 일반적으로 눈에 보이는 것 이상이며 일반적으로 직접 호출해서는 안됩니다.
오래 전 어느 시점에서 무언가의 길이는 메소드 코드가 아닌 함수 여야한다는 결정을 내 렸습니다. 그 len(a)
의미는 초보자에게는 분명하지만 a.len()
그렇게 명확하지는 않을 것이라고 추론했습니다 . 파이썬이 시작되었을 때 __len__
존재조차하지 않았고 len
몇 가지 유형의 객체로 작동하는 특별한 것이 었습니다. 이것이 우리를 떠나는 상황이 타당하든 그렇지 않든간에, 여기에 머물러 있습니다.
내장 또는 연산자의 "전형적인"동작은 __whatever__
관련된 객체에 대해 적절한 매직 메서드 (예 :와 같은 이름을 가진)를 호출하는 (다르고 더 좋은 구문으로) 경우가 많습니다 . 종종 내장 또는 연산자는 "부가가치"를 가지고 있습니다 (관련된 객체에 따라 다른 경로를 취할 수 있음). len
vs 의 경우 __len__
에는 내장에서 누락 된 내장에 대한 약간의 온 전성 검사일뿐입니다. 마법의 방법 :
>>> class bah(object):
... def __len__(self): return "an inch"
...
>>> bah().__len__()
'an inch'
>>> len(bah())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
len
내장에 대한 호출을 볼 때 프로그램이 예외를 발생시키지 않고 그 후에도 계속되면 호출이 2 ** 31 미만의 정수, 음이 아닌 정수를 반환했음을 확신 합니다. 에 대한 호출이 표시 xxx.__len__()
되면 확실하지 않습니다 (코드 작성자가 Python에 익숙하지 않거나 전혀 좋지 않습니다 .-).
다른 내장 기능은 단순한 온 전성 검사 및 가독성 이상의 부가 가치를 제공합니다. 모든 파이썬이 내장 호출과 연산자 사용을 통해 작동하도록 일관되게 설계함으로써 프로그래머는 어떤 경우인지 기억해야하는 부담에서 벗어날 수 있습니다. 2.5 때까지 전화를했다 : (때때로 오류가에서 미끄러 져 foo.next()
그 이전 버전과의 호환성을 위해 계속 작동하는 동안, 당신은 전화해야, 2.6 - next(foo)
과에서 3.*
, 마법의 방법이 제대로 이름 __next__
대신 "죄송합니다 - 도망"의 next
-! ).
따라서 일반적인 규칙은 매직 메서드를 직접 호출하지 않는 것입니다 (하지만 항상 내장을 통해 간접적으로 호출해야 함). 그 이유를 정확히 알지 못하는 경우 (예 : 하위 클래스에서 이러한 메서드를 재정의 할 때) 하위 클래스는 매직 메서드에 대한 명시 적 호출을 통해 수행해야하는 수퍼 클래스를 연기해야합니다.
len ()은 대략 다음과 같다고 생각할 수 있습니다.
def len(x):
return x.__len__()
한 가지 장점은 다음과 같은 내용을 작성할 수 있다는 것입니다.
somelist = [[1], [2, 3], [4, 5, 6]]
map(len, somelist)
대신에
map(list.__len__, somelist)
또는
map(operator.methodcaller('__len__'), somelist)
하지만 약간 다른 동작이 있습니다. 예를 들어 int의 경우
>>> (1).__len__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__len__'
>>> len(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
Pythond 문서 를 확인할 수 있습니다 .
>>> class Meta(type):
... def __getattribute__(*args):
... print "Metaclass getattribute invoked"
... return type.__getattribute__(*args)
...
>>> class C(object):
... __metaclass__ = Meta
... def __len__(self):
... return 10
... def __getattribute__(*args):
... print "Class getattribute invoked"
... return object.__getattribute__(*args)
...
>>> c = C()
>>> c.__len__() # Explicit lookup via instance
Class getattribute invoked
10
>>> type(c).__len__(c) # Explicit lookup via type
Metaclass getattribute invoked
10
>>> len(c) # Implicit lookup
10
참고 URL : https://stackoverflow.com/questions/2481421/difference-between-len-and-len
'developer tip' 카테고리의 다른 글
Swift에서 Array [String] 슬라이싱 반환 유형이 [String]이 아닌 것 같습니다. (0) | 2020.09.21 |
---|---|
주어진 시간에 ffmpeg가있는 비디오의 스크린 샷 1 개를 추출하는 방법은 무엇입니까? (0) | 2020.09.21 |
모든 ASCII 문자 목록을 포함하는 Python 라이브러리가 있습니까? (0) | 2020.09.21 |
Django 클래스 기반 뷰 (TemplateView)의 URL 매개 변수 및 로직 (0) | 2020.09.21 |
ReferenceError : 가져 오기가 정의되지 않았습니다. (0) | 2020.09.21 |