파이썬에서 다형성을 이해하는 방법

爱喝马黛茶的安东尼
풀어 주다: 2019-06-18 11:16:32
원래의
5804명이 탐색했습니다.

Python은 다형성을 지원하지 않으며, 다형성을 지원할 필요도 없습니다. Python은 다형성 언어이며 덕 타이핑을 옹호합니다. 객체의 효과적인 의미 체계는 특정 클래스에서 상속하거나 특정 인터페이스를 구현하는 것이 아니라 현재 메서드 및 속성 집합에 따라 결정됩니다. 파이썬에서 다형성을 이해하는 방법

Polymorphism

은 상위 개체를 하나 이상의 하위 개체와 동일하게 설정할 수 있는 기술입니다. 예를 들어 Parent:=Child; 다형성을 사용하면 동일한 클래스(기본 클래스) 유형의 포인터를 사용하여 다른 클래스의 개체를 참조하고 참조된 개체에 따라 다른 방식으로 동일한 작업을 수행할 수 있습니다.

관련 권장 사항: "python 비디오 튜토리얼"

class A:
def prt(self):
print("A")
class B(A):
def prt(self):
print("B")
class C(A):
def prt(self):
print("C")
class D(A):
pass
class E:
def prt(self):
print("E")
class F:
pass
def test(arg):
arg.prt()
a = A()
b = B()
c = C()
d = D()
e = E()
f = F()
test(a)
test(b)
test(c)
test(d)
test(e)
test(f)

输出结果

A
B
C
A
E
Traceback (most recent call last):
File "D:/Python/多态1.py", line 45, in <module>
test(f)
File "D:/Python/多态1.py", line 30, in test
arg.prt()
AttributeError: &#39;F&#39; object has no attribute &#39;prt&#39;
Process finished with exit code 1
로그인 후 복사

얼핏 보면 Python이 test(a), test를 호출하는 다형성을 지원하는 것 같습니다. (b), test(c) 및 test(d)는 매우 잘 작동하지만 다음은 매우 다릅니다.
test(e)를 호출할 때 Python은 e의 prt 메서드만 호출하고 e가 A 하위 클래스의 객체인지 여부를 확인하지 않습니다. (사실 테스트 메서드가 다음과 같은 경우 매개변수의 유형이 지정되지 않습니다. 정의되어 있고 파이썬은 그것을 전혀 결정할 수 없습니다).
test(f)를 호출할 때 오류가 발생합니다. 이유는 매우 간단합니다. f에는 prt 메소드가 없습니다.

우선 Python은 다형성을 지원하지 않으며, 다형성을 지원할 필요도 없습니다. Python은 다형성 언어이며 덕 타이핑을 옹호합니다. 다음은 Wikipedia의 덕 타이핑에 대한 논의입니다.

프로그래밍에서 덕 타이핑(영어: duck Typing)은 동적 타이핑의 스타일입니다. 이 스타일에서 객체의 효과적인 의미는 특정 클래스에서 상속하거나 특정 인터페이스를 구현하는 것이 아니라 현재 메서드 및 속성 집합에 따라 결정됩니다. 이 개념의 이름은 James Whitcomb Riley가 제안한 오리 테스트에서 유래되었습니다. "오리 테스트"는 다음과 같이 표현될 수 있습니다.

"오리처럼 걷는 새를 보면, 오리처럼 헤엄칩니다. 오리, 꽥꽥 소리 오리처럼 새도 오리라고 부를 수 있습니다.”

오리 타이핑에서는 물체 자체의 유형이 아니라 어떻게 사용되는지에 중점을 둡니다. 예를 들어,
오리 타이핑을 사용하지 않는 언어에서는 duck 유형의 객체를 받아들이고 해당 객체의 걷기 및 짖기 메소드를 호출하는 함수를 작성할 수 있습니다.
오리 타이핑을 사용하는 언어에서 이러한 함수는 모든 유형의 객체를 허용하고 해당 객체의 걷기 및 호출 메서드를 호출할 수 있습니다. 호출해야 하는 메서드가 존재하지 않으면 런타임 오류가 발생합니다. 올바른 걷기 및 호출 메소드를 가진 모든 객체가 함수에 의해 허용될 수 있다는 사실은 위의 설명으로 이어지며, 따라서 이러한 유형 결정 방법의 이름이 붙여졌습니다.

Duck 타이핑은 메소드와 함수의 매개변수 유형을 테스트하지 않고 문서화, 명확한 코드, 테스트에 의존하여 올바른 사용법을 확인함으로써 이점을 얻을 수 있는 경우가 많습니다. 정적으로 유형이 지정된 언어에서 동적으로 유형이 지정된 언어로 이동하는 사용자는 종종 정적(런타임 전) 유형 검사를 추가하려고 시도하므로 덕 타이핑의 이점과 확장성이 손상되고 언어의 동적 특성이 제한됩니다.

Python의 객체도 메모리의 일부라는 것은 의심의 여지가 없습니다. 메모리에는 속성과 메서드 외에도 객체의 유형도 포함됩니다. a=A(), 먼저 Python은 객체 A를 생성한 다음 변수 a를 선언하고 변수 a를 객체 A에 연결합니다. 변수 a에는 유형이 없으며 해당 유형은 연관된 객체에 따라 다릅니다. a=A()일 때 a는 A 유형의 참조입니다. a는 A 유형이라고 말할 수 있습니다. a에 3의 값이 할당되고 a=3이면 a는 정수 참조이지만 Python은 약하지 않습니다. 유형 언어, Python '2'+3에서는 오류가 보고되고, PHP에서는 '2'+3에서는 5가 표시됩니다. 파이썬의 변수는 c의 포인터와 유사하다고 이해할 수 있습니다. c와의 차이점은 파이썬의 변수가 어떤 유형이든 가리킬 수 있다는 것입니다. 이렇게 말하는 것이 정확하지는 않지만 이해하기 쉽습니다.
따라서 Python 실행 중에는 매개변수가 전달되기 전에는 매개변수의 유형을 알 수 없습니다. Python의 메소드도 Late Binding이지만 Java의 Polymorphic Late 바인딩과는 다릅니다. Python에서는 최소한 객체의 유형을 알고 있지만 Python은 매개변수의 유형을 모릅니다.

테스트 메소드에서는 하나의 매개변수를 받고 이 매개변수의 prt 메소드를 호출한다고만 규정합니다. 실행할 때 이 매개변수에 prt 메소드가 있으면 Python이 이를 실행합니다. 그렇지 않으면 abcde에는 prt 메소드가 있지만 f에는 없기 때문에 Python이 오류를 보고하므로 위의 결과가 Python이 실행되는 방식입니다.

위 내용은 파이썬에서 다형성을 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿