prosource

len()과 .__len__(의 차이?

probook 2023. 10. 15. 17:28
반응형

len()과 .__len__(의 차이?

전화하는 것과 다른 점이 있습니까?len([1,2,3])아니면[1,2,3].__len__()?

눈에 보이는 차이가 없다면 뒤에서 다르게 하는 것은 무엇입니까?

len는 컬렉션의 길이를 구하는 함수입니다.그것은 물체의 것을 부름으로써 작동합니다.__len__방법.__something__속성들은 특별하고 보통 눈과 마주치는 것 이상이며, 일반적으로 직접 호출되지 않아야 합니다.

어떤 것의 길이를 얻는 것은 함수가 되어야 하고 방법 코드가 되어서는 안 된다는 것을 추론하면서 오래 전 어느 시점에서 결정되었습니다.len(a)의 의미는 초보자에게는 분명하겠지만.a.len()분명하지 않을 겁니다파이썬이 시작했을때__len__존재하지도 않았고,len몇 가지 종류의 물건을 가지고 작업한 특별한 것이었습니다.상황이 완전히 말이 되든 안 되든 간에, 우리는 여기에 머물러야 합니다.

내장형 또는 연산자의 "전형적인" 동작은 종종 (다른 더 좋은 구문을 가진) 적합한 마법 방법을 호출하는 경우입니다 (이름을 부르는 경우입니다.__whatever__관련된 개체에 대해 설명합니다.종종 기본 제공자 또는 연산자는 "부가가치"를 갖습니다. (관련된 객체에 따라 다른 경로를 취할 수 있음).len__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기본 제공, 프로그램이 예외를 제기하지 않고 그 이후에도 계속 진행되는 경우, 호출이 정수, 음이 아닌 값을 반환하고<= sys.maxsize-- 에 전화가 오면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

, .len(s)내장된 파이썬 메소드로 객체의 길이를 반환합니다. 이제__len__()입니다에서 입니다.len(s)개체의 길이를 반환하는 메서드입니다.

그래서 저희가 전화를 하면.len(s)법,s.__len__()길이를 계산하기 위해 막후에서 실제로 일어나는 일입니다.

len()함수는 다음과 같이 해석할 수 있습니다.

def len(s):
    return s.__len__()

언급

한 가지 추가 의견:

len(c)그리고.c.__len__()다른 값을 반환할 수 있습니다.할 때 합니다.__len__c.

>>> class C:
...     def __len__(self):
...         return 10
...
>>> c = C()
>>> c.__len__ = lambda: 3
>>> len(c)                    # C's __len__ invoked
10
>>> type(c).__len__(c)        # C's __len__ invoked
10
>>> c.__len__()               # c's __len__ invoked
3

언급URL : https://stackoverflow.com/questions/2481421/difference-between-len-and-len

반응형