developer tip

len ()과 .__ len __ ()의 차이점은 무엇입니까?

optionbox 2020. 9. 21. 07:37
반응형

len ()과 .__ len __ ()의 차이점은 무엇입니까?


len([1,2,3])또는 호출 사이에 차이가 [1,2,3].__len__()있습니까?

눈에 띄는 차이가 없다면 무대 뒤에서 다르게 수행되는 것은 무엇입니까?


len컬렉션의 길이를 구하는 함수입니다. 개체의 __len__메서드 를 호출하여 작동합니다 . __something__속성은 특별하고 일반적으로 눈에 보이는 것 이상이며 일반적으로 직접 호출해서는 안됩니다.

오래 전 어느 시점에서 무언가의 길이는 메소드 코드가 아닌 함수 여야한다는 결정을 내 렸습니다. 그 len(a)의미는 초보자에게는 분명하지만 a.len()그렇게 명확하지는 않을 것이라고 추론했습니다 . 파이썬이 시작되었을 때 __len__존재조차하지 않았고 len몇 가지 유형의 객체로 작동하는 특별한 것이 었습니다. 이것이 우리를 떠나는 상황이 타당하든 그렇지 않든간에, 여기에 머물러 있습니다.


내장 또는 연산자의 "전형적인"동작은 __whatever__관련된 객체에 대해 적절한 매직 메서드 (예 :와 같은 이름을 가진)를 호출하는 (다르고 더 좋은 구문으로) 경우가 많습니다 . 종종 내장 또는 연산자는 "부가가치"를 가지고 있습니다 (관련된 객체에 따라 다른 경로를 취할 수 있음). lenvs 의 경우 __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

반응형