>  기사  >  백엔드 개발  >  Python의 클래스

Python의 클래스

高洛峰
高洛峰원래의
2016-10-19 15:19:301571검색

파이썬은 함수 프로그래밍에서 다른 언어가 따라올 수 없는 장점을 갖고 있지만, 파이썬도 OO 언어라는 사실을 잊어서는 안 됩니다. 따라서 FP에서 Python의 장점에 주목하는 동시에 Python의 OO 특성도 이해해야 합니다.

파이썬의 OO 기능을 논하려면 당연히 파이썬의 클래스를 이해하는 것이 가장 먼저 해야 합니다. Python에서 클래스를 정의하고 객체 인스턴스를 생성하는 것은 매우 간단합니다. 구체적인 코드는 다음과 같습니다.

class GrandPa:
    def __init__(self):
        print('I\'m GrandPa')
  
  
class Father(GrandPa):
    def __init__(self):
        print('I\'m Father!')
  
class Son(Father):
    """A simple example class"""
    i = 12345
    def __init__(self):
        print('这是构造函数,son')
    def sayHello(self):
        return 'hello world'
  
if __name__ == '__main__':
    son = Son()
    # 类型帮助信息
    print('类型帮助信息: ',Son.__doc__)
    #类型名称
    print('类型名称:',Son.__name__)
    #类型所继承的基类
    print('类型所继承的基类:',Son.__bases__)
    #类型字典
    print('类型字典:',Son.__dict__)
    #类型所在模块
    print('类型所在模块:',Son.__module__)
    #实例类型
    print('实例类型:',Son().__class__)

작업:

Python 3.3.2(v3.3.2:d047928ae3f6, May) 16 2013, 00:03:43) win32의 [MSC v.1600 32비트(Intel)]

자세한 내용을 보려면 "copyright", "credits" 또는 "license()"를 입력하세요.

> >> ================================= 다시 시작 ============ === ================

>>>

생성자입니다, 아들

도움말 정보 입력 : 간단한 예제 클래스

유형 이름: Son

유형이 상속하는 기본 클래스: (,)

유형 사전: {'__module__': ' __main__', ' sayHello': , '__doc__': 'A simple example class', '__init__': , 'i': 12345}

유형이 위치한 모듈: __main__

이것은 생성자입니다. 아들

인스턴스 유형:

>>>

#Python은 다중 상속을 지원합니다

우선, Class의 정의에 상속이 반영되는 대괄호가 있음을 알 수 있습니다. Java는 확장을 사용하고 C# 및 C++는 콜론(:)을 사용하며 Python은 괄호를 사용합니다. 괄호 안에는 두 가지 값이 포함되어 있습니다. 똑똑하다면 Python은 다중 상속을 지원합니다.

#__init__은 Class

두 번째 지점인 __init__입니다. is 클래스 두 가지 다른 형태의 생성자는 함수 오버로딩에 대한 Python의 지원을 반영합니다. 생성자에는 특수 매개변수 self가 있는데, 그 의미는 Java 및 C#에서 흔히 사용되는 것과 동일합니다. 여기서 한 가지 강조할 점은 Class에 정의된 메서드는 본질적으로 함수이지만 메서드를 정의할 때 self 매개 변수가 포함되어야 하고 self 매개 변수가 먼저 배치되어야 한다는 것입니다.

#python 멤버 변수;

세 번째 요점은 Python에서는 클래스의 데이터 멤버를 명시적으로 선언할 필요가 없다는 것입니다. 대신 값을 할당할 때 할당된 변수는 그에 따라 클래스의 데이터 멤버가 됩니다. 코드 x와 y는 . 데이터 멤버를 명시적으로 선언할 필요가 없을 뿐만 아니라 더 특별한 점은 del 메소드를 통해 클래스의 데이터 멤버를 삭제할 수도 있다는 것입니다. 처음 이런 기능을 봤을 때 정말 놀랐습니다. 결국 OO의 첫 번째 포인트는 encapsulation인데, 이 기능이 encapsulation의 특성을 파괴하는 걸까요?

#Python 메서드 모호성 문제

네 번째 점은 Python이 다중 상속을 지원하기 때문에 메서드 모호성 문제가 발생할 수 있다는 점입니다[1]. 그러나 Python은 깊이 우선 탐색 규칙을 따르기 때문에 메서드 모호성 문제를 방지합니다. 예를 들어, 위 코드에서 MyClass는 BaseClassA와 BaseClassB 모두에서 상속됩니다. MyClass가 파생된 메서드를 호출하고 파생된 메서드가 BaseClassA와 BaseClassB 모두에 정의되어 있고 Signature가 정확히 동일하면 BaseClassA의 메서드는 다음과 같습니다. 라고 불리는. DerivedMethod가 BaseClassA에 정의되어 있지 않지만 BaseClassA의 상위 클래스가 이 메서드를 정의하는 경우 BaseClassA의 상위 클래스에 있는 파생 메서드가 호출됩니다. 즉, 상속 메서드 검색 경로는 왼쪽에서 오른쪽으로 BaseClass를 선택한 후 해당 BaseClass의 상속 구조를 따라 최상위까지 검색된 다음 다른 BaseClass로 검색됩니다.

지금은 이것이 전부입니다. Python의 OO 기능은 향후 게시물에서 자세히 설명하겠습니다.

[1] 메소드 모호성: 클래스는 둘 이상의 상위 클래스에서 동시에 상속되고 이러한 상위 클래스에는 정확히 동일한 시그니처를 가진 메소드가 있으므로 컴파일러는 무엇을 결정할 수 없습니다. 어떤 상위 클래스가 메소드를 상속하여 메소드 모호성을 초래하게 됩니까?


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