>  기사  >  백엔드 개발  >  Python의 덕 타이핑에 대한 자세한 소개

Python의 덕 타이핑에 대한 자세한 소개

高洛峰
高洛峰원래의
2017-02-23 11:18:411554검색

파이썬 개발자들은 파이썬의 덕 타이핑에 익숙하다고 생각합니다. 위키피디아에서는 덕 타이핑에 대한 정확한 정의가 '동적 타이핑 스타일'입니다. 이 스타일에서 객체의 효과적인 의미는 특정 클래스에서 상속하거나 특정 인터페이스를 구현하는 것이 아니라 "현재 메서드 및 속성 집합"에 의해 결정됩니다. 그래서 이 기사에서는 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: &#39;Another_iterAbleClass&#39; 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 중국어 홈페이지를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.