파이썬 개발자들은 파이썬의 덕 타이핑에 익숙하다고 생각합니다. 위키피디아에서는 덕 타이핑에 대한 정확한 정의가 '동적 타이핑 스타일'입니다. 이 스타일에서 객체의 효과적인 의미는 특정 클래스에서 상속하거나 특정 인터페이스를 구현하는 것이 아니라 "현재 메서드 및 속성 집합"에 의해 결정됩니다. 그래서 이 기사에서는 Python의 덕 타이핑(Duck Typing)에 대해 설명합니다.
오리 유형의 기본 정의
우선 Python은 다형성을 지원하지 않으며, 다형성을 지원할 필요도 없습니다. Python은 일종의 다형성 언어로 덕 타이핑(Duck Typing)을 옹호합니다.
다음은 위키피디아에서 나온 덕 타이핑에 대한 논의입니다.
프로그래밍에서 덕 타이핑(영어: 덕 타이핑)은 동적 타이핑 스타일입니다. 이 스타일에서 객체의 효과적인 의미는 특정 클래스에서 상속하거나 특정 인터페이스를 구현하는 것이 아니라 현재 메서드 및 속성 집합에 따라 결정됩니다. 이 개념의 이름은 James Whitcomb Riley가 제안한 오리 테스트에서 유래되었습니다. "오리 테스트"는 다음과 같이 표현될 수 있습니다.
"오리처럼 걷는 새를 보면, 마치 헤엄치듯이 헤엄칩니다. 오리 같고, 오리처럼 꽥꽥거릴 때, 오리처럼 보이면 새를 오리라고 부를 수 있어요."
오리 타이핑에서는 물체 자체의 종류에 중점을 두지 않고, 하지만 그것이 어떻게 사용되는지에 대해서. 예를 들어, 오리 타이핑을 사용하지 않는 언어에서는 duck 유형의 객체를 가져와서 해당 객체의 걷기 및 짖기 메서드를 호출하는 함수를 작성할 수 있습니다. 덕 타이핑을 사용하는 언어에서 이러한 함수는 모든 유형의 객체를 허용하고 해당 객체의 걷기 및 호출 메서드를 호출할 수 있습니다. 호출해야 하는 메서드가 존재하지 않으면 런타임 오류가 발생합니다. 올바른 걷기 및 호출 메소드를 가진 모든 객체가 함수에 의해 허용될 수 있다는 사실은 위의 설명으로 이어지며, 따라서 이러한 유형 결정 방법의 이름이 붙여졌습니다.
오리 타이핑은 메소드와 함수의 인수 유형을 테스트하지 않고 문서화, 명확한 코드, 테스트를 통해 올바른 사용법을 확인함으로써 이점을 얻을 수 있는 경우가 많습니다. 정적으로 유형이 지정된 언어에서 동적으로 유형이 지정된 언어로 이동하는 사용자는 종종 정적(런타임 전) 유형 검사를 추가하려고 시도하여 덕 타이핑의 이점과 확장성을 손상시키고 언어의 동적 특성을 제한합니다.
Python의 특정 구현
다음 코드는 간단한 duck 유형입니다
class duck(): def walk(self): print('I walk like a duck') def swim(self): print('i swim like a duck') class person(): def walk(self): print('this one walk like a duck') def swim(self): print('this man swim like a duck')
duck 유형의 경우 객체 자체의 유형이나 클래스 상속은 중요하지 않고 클래스가 어떻게 사용되는지는 중요하지 않습니다. 다음 코드를 통해 이러한 클래스의 메서드를 호출할 수 있습니다.
def watch_duck(animal): animal.walk() animal.swim() small_duck = duck() watch_duck(small_duck) output >> I walk like a duck i swim like a duck duck_like_man = person() watch_duck(duck_like_man) output >> this one walk like a duck this man swim like a duck class Lame_Foot_Duck(): def swim(self): print('i am lame but i can swim') lame_duck = Lame_Foot_Duck() watch_duck(lame_duck) output >> AttributeError: Lame_Foot_Duck instance has no attribute 'walk'
watch_duck
함수는 이 클래스의 객체를 전달받아 객체의 종류를 확인하지 않고 걷기, 수영 메소드를 직접 호출한다. 필요한 메소드가 없으면 오류가 보고됩니다.
파이썬에서 덕 타이핑의 구체적인 실시예는 다음 코드와 같다
class CollectionClass(): lists = [1,2,3,4] def __getitem__(self, index): return self.lists[index] iter_able_object = CollectionClass() class Another_iterAbleClass(): lists=[1,2,3,4] list_position = -1 def __iter__(self): return self def next(self): #还有更简单的实现,使用生成器或迭代器什么的:) self.list_position += 1 if self.list_position >3: raise StopIteration return self.lists[self.list_position] another_iterable_object=Another_iterAbleClass() print(iter_able_object[1]) print(iter_able_object[1:3]) output>> 2 [2, 3] another_iterable_object[2] output>> Traceback (most recent call last): File "/Users/steinliber/a.py", line 32, in <module> another_iterable_object[2] TypeError: 'Another_iterAbleClass' object does not support indexing print(next(another_iterable_object)) output>> 1 print(next(another_iterable_object)) output>> 2 print(next(iter_able_object)) output>> Traceback (most recent call last): File "/Users/steinliber/a.py", line 29, in <module> print(next(iter_able_object)) TypeError: IterAbleClass object is not an iterator
파이썬에서 위 코드의 구현 방법 프로토콜(프로토콜)이라고 하며 이러한 프로토콜은 호출자가 이 함수를 사용하기 위해 호출해야 하는 개체의 메서드와 이 기능을 완료하기 위해 호출 수신자가 구현해야 하는 메서드를 지정하는 알림 인터페이스로 간주될 수 있습니다. Java의 인터페이스와 다른 점은 Java의 인터페이스 기능은 상속을 통해 구현되어야 한다는 점입니다. 상속된 클래스는 인터페이스의 모든 추상 메소드를 구현해야 하므로 Java에서는 유형의 개념이 강조됩니다. protocol
Python에서는 더 많은 정보를 제공합니다. 함수는 특정 함수를 구현하기 위해 호출해야 하는 개체를 지정합니다. 이러한 메서드를 구현하는 모든 클래스는 이 함수를 구현할 수 있습니다.
구체적으로 말하면 위의 두 클래스 중 첫 번째 클래스는 __getitem__
메서드를 구현한 다음 Python 인터프리터가 이를 컬렉션으로 처리하고 이 클래스의 개체에 대해 슬라이스를 사용할 수 있습니다. 하위 항목을 얻는 경우, 두 번째 클래스가 __iter__
및 next
메서드를 구현하면 Python은 이를 반복자로 간주하고 이 클래스의 개체에 대한 루프를 통해 각 하위 항목을 얻을 수 있습니다. 클래스는 구현할 수 있는 메서드를 구현할 수 있으며, 의미가 있는 상황에서만 사용할 수 있습니다.
위의 duck 클래스와 비교하면 모서리 자르기에 사용되는 [](실제로 Python의 slice
함수를 호출함)와 반복에 사용되는 iter()
는 watch_duck
함수와 동일하며, 이러한 함수는 객체를 수신합니다. 함수를 구현하기 위해 필요한 객체의 클래스 및 호출 메소드 중 해당 함수에서 호출된 메소드 객체가 존재하지 않으면 오류가 보고됩니다.
위에서 볼 수 있듯이 Python 덕 타이핑의 유연성은 객체 유형 자체가 무엇인지보다는 호출된 객체가 어떻게 사용되는지에 초점을 맞춘다는 것입니다. 따라서 Python에서 들어오는 매개변수의 유형을 결정하기 위해 isinstance
를 사용하는 것은 권장되지 않습니다. 더 좋은 방법은 들어오는 매개변수를 직접 사용하고 들어오는 매개변수가 형식을 충족하지 않는 경우 try 및 pythonic
을 사용하여 처리하는 것입니다. 요구 사항. 객체의 유형을 전달하는 대신 해당 기능을 전달하여 객체를 사용해야 합니다. except
요약
위는 Python duck 유형에 대한 자세한 소개입니다. 이 기사의 내용은 여전히 매우 자세하게 설명되어 있습니다. 파이썬을 배우는 여러분, 궁금한 점이 있으면 메시지를 남겨서 소통하세요.
파이썬의 덕 타이핑에 대한 더 자세한 글은 PHP 중국어 홈페이지를 주목해주세요!