찾다
백엔드 개발파이썬 튜토리얼Python의 덕 타이핑에 대한 자세한 소개

파이썬 개발자들은 파이썬의 덕 타이핑에 익숙하다고 생각합니다. 위키피디아에서는 덕 타이핑에 대한 정확한 정의가 '동적 타이핑 스타일'입니다. 이 스타일에서 객체의 효과적인 의미는 특정 클래스에서 상속하거나 특정 인터페이스를 구현하는 것이 아니라 "현재 메서드 및 속성 집합"에 의해 결정됩니다. 그래서 이 기사에서는 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으로 문의하세요.
파이썬 어레이에 어떤 데이터 유형을 저장할 수 있습니까?파이썬 어레이에 어떤 데이터 유형을 저장할 수 있습니까?Apr 27, 2025 am 12:11 AM

PythonlistsCanstoreAnyDatAtype, ArrayModuLearRaysStoreOneType 및 NUMPYARRAYSAREFORNUMERICALPUTATION.1) LISTSAREVERSATILEBUTLESSMEMORY-EFFICENT.2) ARRAYMODUERRAYRAYRAYSARRYSARESARESARESARESARESARESAREDOREDORY-UNFICEDONOUNEOUSDATA.3) NumpyArraysUraysOrcepperperperperperperperperperperperperperperperferperferperferferpercient

파이썬 어레이에 잘못된 데이터 유형의 값을 저장하려고하면 어떻게됩니까?파이썬 어레이에 잘못된 데이터 유형의 값을 저장하려고하면 어떻게됩니까?Apr 27, 2025 am 12:10 AM

whenyouattempttoreavalueofthewrongdatatypeinapythonaphonarray, thisiSdueTotheArrayModule의 stricttyPeenforcement, theAllElementStobeofthesAmetypecified bythetypecode.forperformancersassion, arraysaremoreficats the thraysaremoreficats thetheperfication the thraysaremorefications는

Python Standard Library의 일부는 무엇입니까? 목록 또는 배열은 무엇입니까?Python Standard Library의 일부는 무엇입니까? 목록 또는 배열은 무엇입니까?Apr 27, 2025 am 12:03 AM

Pythonlistsarepartoftsandardlardlibrary, whileraysarenot.listsarebuilt-in, 다재다능하고, 수집 할 수있는 반면, arraysarreprovidedByTearRaymoduledlesscommonlyusedDuetolimitedFunctionality.

스크립트가 잘못된 파이썬 버전으로 실행되는지 확인해야합니까?스크립트가 잘못된 파이썬 버전으로 실행되는지 확인해야합니까?Apr 27, 2025 am 12:01 AM

thescriptIsrunningwithHongpyThonversionDueCorRectDefaultTerpretersEttings.tofixThis : 1) checktheDefaultPyThonVersionUsingPyThon-VersionorPyThon3- version.2) usvirtual-ErondmentsBythePython.9-Mvenvmyenv, 활성화, 및 파괴

파이썬 어레이에서 수행 할 수있는 일반적인 작업은 무엇입니까?파이썬 어레이에서 수행 할 수있는 일반적인 작업은 무엇입니까?Apr 26, 2025 am 12:22 AM

PythonArraysSupportVariousOperations : 1) SlicingExtractsSubsets, 2) 추가/확장 어드먼트, 3) 삽입 값 삽입 ATSpecificPositions, 4) retingdeletesElements, 5) 분류/ReversingChangesOrder 및 6) ListsompectionScreateNewListSbasedOnsistin

어떤 유형의 응용 프로그램에서 Numpy Array가 일반적으로 사용됩니까?어떤 유형의 응용 프로그램에서 Numpy Array가 일반적으로 사용됩니까?Apr 26, 2025 am 12:13 AM

NumpyArraysareSentialplosplicationSefficationSefficientNumericalcomputationsanddatamanipulation. Theyarcrucialindatascience, MachineLearning, Physics, Engineering 및 Financeduetotheiribility에 대한 handlarge-scaledataefficivally. forexample, Infinancialanyaly

파이썬의 목록 위의 배열을 언제 사용 하시겠습니까?파이썬의 목록 위의 배열을 언제 사용 하시겠습니까?Apr 26, 2025 am 12:12 AM

UseanArray.ArrayOveralistInpyThonWhendealingwithhomogeneousData, Performance-CriticalCode, OrinterFacingwithCcode.1) HomogeneousData : ArraysSaveMemorywithtypepletement.2) Performance-CriticalCode : arraysofferbetterporcomanceFornumericalOperations.3) Interf

모든 목록 작업은 배열에 의해 지원됩니까? 왜 또는 왜 그렇지 않습니까?모든 목록 작업은 배열에 의해 지원됩니까? 왜 또는 왜 그렇지 않습니까?Apr 26, 2025 am 12:05 AM

아니요, NOTALLLISTOPERATIONARESUPPORTEDBYARRARES, andVICEVERSA.1) ArraySDONOTSUPPORTDYNAMICOPERATIONSLIKEPENDORINSERTWITHUTRESIGING, WHITHIMPACTSPERFORMANCE.2) ListSDONOTEECONSTANTTIMECOMPLEXITEFORDITITICCESSLIKEARRAYSDO.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.