사례를 통해python 오리 유형의 관련 원리를 분석하다

3463 단어 python오리.유형
우선Python은 다태를 지원하지 않고 다태를 지원할 필요도 없다.python은 다태 언어로 오리 유형을 숭상한다.
프로그래밍에서 오리 유형(영어:duck typing)은 동적 유형의 한 스타일이다.이런 스타일에서 하나의 대상의 효과적인 의미는 특정한 종류를 계승하거나 특정한 인터페이스를 실현하는 것이 아니라 현재의 방법과 속성의 집합에 의해 결정된다.이 개념의 이름은 제임스 화이트콤 릴리가 제기한 오리 테스트에서 유래한 것이다.
오리 테스트는 다음과 같이 설명할 수 있습니다.
"새 한 마리가 걷는 것이 오리 같고, 수영하는 것이 오리 같고, 짖는 것도 오리 같다. 그러면 이 새는 오리라고 할 수 있다."
오리 유형에서 관심은 대상의 유형 자체가 아니라 어떻게 사용하는가이다.예를 들어 오리 유형을 사용하지 않는 언어에서 우리는 하나의 함수를 작성할 수 있다. 그것은 오리 유형의 대상을 받아들이고 오리의 걸음걸이와 짖는 방법을 호출할 수 있다.오리 유형을 사용하는 언어에서, 이러한 함수는 임의의 유형의 대상을 받아들일 수 있으며, 그것의 걷는 방법과 부르는 방법을 호출할 수 있다.만약 이 호출되어야 할 방법이 존재하지 않는다면, 실행 중 오류를 일으킬 것입니다.이러한 정확한 걷기와 부르는 방법을 가진 모든 대상은 함수에 의해 받아들일 수 있는 이런 행위에 대해 상기 설명을 인용하였으며, 이러한 유형을 결정하는 방식은 이로 인해 이름을 얻었다.
오리 유형은 일반적으로 테스트 방법과 함수 중의 매개 변수의 유형이 아니라 문서, 뚜렷한 코드와 테스트에 의존하여 정확한 사용을 확보하는 덕분이다.정적 유형 언어에서 동적 유형 언어로 전환하는 사용자는 일반적으로 정적 (운행 전의) 유형 검사를 추가하여 오리 유형의 장점과 신축성에 영향을 주고 언어의 동적 특성을 제약하려고 한다.
-------------------------------------------
의심할 여지없이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를 얻는다.이렇게 이해할 수 있다.python에서 변수는 c의 바늘과 유사하고, c와 달리python에서 변수는 어떤 유형을 가리킬 수 있다. 이렇게 말하는 것은 정확하지 않지만 이해하기 쉽다.
따라서python이 운행하는 과정에서 매개 변수가 전달되기 전에는 매개 변수의 유형을 몰랐다. 비록python의 방법도 후기 귀속이지만 자바의 다태적 후기 귀속과는 다르다. 자바의 후기 귀속은 적어도 대상의 유형을 알고 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 "/Users/shikefu678/Documents/Aptana Studio 3 Workspace/demo/demo.py", line 33, in <module> 
  test(a),test(b),test(c),test(d),test(e),test(f) 
 File "/Users/shikefu678/Documents/Aptana Studio 3 Workspace/demo/demo.py", line 24, in test 
  arg.prt() 
AttributeError: F instance has no attribute 'prt' 
a, b, c, d는 모두 A유형의 변수이기 때문에 기대하는 효과(자바 각도에서 기대하는 것)를 얻을 수 있다. e는 A유형의 변수가 아니지만 오리유형에 따라 걸어가면 오리, 수영하면 오리, 짖어도 오리와 같다. 그러면 이 새는 오리라고 할 수 있다. e는prt방법이 있기 때문에 테스트 방법에서 e는 A유형의 변수이고 f는prt방법이 없기 때문에 f는 A유형의 변수가 아니다.
이상은java의 측면에서 분석한 것으로 사실 위쪽은 모두 허튼소리이고python의 운행 방법을 설명하기 위해서이다.테스트 방법이 수신된 매개 변수가 어떤 유형인지 규정한 사람은 아무도 없다.테스트 방법은 매개 변수를 수신하고 이 매개 변수를 호출하는prt 방법만 규정합니다.실행할 때 이 매개 변수에prt방법이 있으면python이 실행하고, 없으면python이 오류를 보고합니다. abcde에prt방법이 있고 f가 없기 때문에 위에서 얻은 결과를 얻었습니다. 이것이python의 실행 방식입니다.
python을 배운 지 3개월이 되었는데 예전에는 자바를 잘 배운 적이 없지만 자바 측의 책을 보면 많은 사고방식이 바뀌지 않고 자바의 사고방식으로python의 문제를 생각하려고 한다. 실제로 그렇게 하면 엉뚱할 뿐이다.python에 자바와 다른 것이 너무 많아서 안에서 밖으로 다르다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기