상속은 파이썬을 포함한 객체 지향 프로그래밍의 기본 개념입니다. 클래스 (자식 또는 파생 수업이라고 함)가 다른 클래스 (부모 또는 기본 클래스라고 함)의 속성과 방법을 상속받을 수 있습니다. 이것은 코드 재사용을 촉진하고 클래스 간의 계층 적 관계를 확립합니다.
Python에서는 구문 class ChildClass(ParentClass):
사용하여 상속이 구현됩니다. 예는 다음과 같습니다.
<code class="python">class Animal: def __init__(self, name): self.name = name def speak(self): pass class Dog(Animal): def speak(self): return f"{self.name} says Woof!" my_dog = Dog("Buddy") print(my_dog.speak()) # Output: Buddy says Woof!</code>
이 예에서 Dog
Animal
로부터 물려받는 어린이 계급입니다. Dog
Class는 speak
방법을 무시하여 자체 구현을 제공합니다.
Python은 또한 여러 상속을 지원하며, 여기서 클래스는 여러 학부모 클래스에서 상속받을 수 있습니다. 이것은 클래스 정의의 괄호 안에 부모 클래스를 나열하여 쉼표로 분리하여 달성됩니다. 작동 방식은 다음과 같습니다.
<code class="python">class Mammal: def __init__(self, mammal_name): self.mammal_name = mammal_name class Carnivore: def __init__(self, diet): self.diet = diet class Dog(Mammal, Carnivore): def __init__(self, name, diet): Mammal.__init__(self, name) Carnivore.__init__(self, diet) my_dog = Dog("Buddy", "meat") print(my_dog.mammal_name) # Output: Buddy print(my_dog.diet) # Output: meat</code>
이 예에서 Dog
Mammal
과 Carnivore
모두에서 물려받습니다. Dog
__init__
방법은 두 부모 클래스의 생성자를 호출하여 두 가지의 속성을 초기화합니다.
상속은 파이썬 프로그래밍에서 몇 가지 중요한 이점을 제공합니다.
다이아몬드 문제는 서브 클래스가 공통 조상이있는 두 클래스에서 상속 될 때 모호성이 발생하는 다중 상속에서 일반적인 문제입니다. 파이썬 에서이 문제는 메소드 해상도 순서 (MRO)라고도 알려진 C3 선형화 알고리즘을 사용하여 완화되어 메소드 및 속성을 해결하기위한 일관된 순서를 정의합니다.
다이아몬드 문제를 명시 적으로 피하고 원하는 행동을 보장합니다.
super()
함수 사용 : 부모 클래스 메소드를 직접 호출하는 대신 super()
사용하여 메소드 해상도가 MRO를 따릅니다. 이는 호출 방법의 모호성을 피하고 다이아몬드 문제의 가능성을 줄이는 데 도움이됩니다.mro()
메소드 또는 __mro__
속성을 사용하여 메소드가 호출 될 순서를 확인할 수 있습니다. 다음은 다이아몬드 문제와 super()
어떻게 도울 수 있는지를 보여주는 예입니다.
<code class="python">class A: def __init__(self): print("A") class B(A): def __init__(self): print("B") super().__init__() class C(A): def __init__(self): print("C") super().__init__() class D(B, C): def __init__(self): print("D") super().__init__() d = D() print(D.mro())</code>
출력은 다음과 같습니다.
<code>D B C A [<class>, <class>, <class>, <class>, <class>]</class></class></class></class></class></code>
MRO는 다이아몬드 문제를 피하기 위해 각 __init__
메소드가 정확히 한 번 호출되도록합니다.
파이썬 상속의 맥락에서, 메소드 재정의 및 메소드 과부하는 다형성을 달성하는 데 사용되는 개념이지만 다르게 작동합니다.
메소드 오버라이딩 : 메소드 재정의가 자식 클래스가 부모 클래스에서 이미 정의 된 메소드에 대한 특정 구현을 제공 할 때 발생합니다. 이를 통해 하위 클래스는 상속 된 방법의 동작을 사용자 정의하거나 확장 할 수 있습니다.
예:
<code class="python">class Animal: def speak(self): return "Some sound" class Dog(Animal): def speak(self): return "Woof!" dog = Dog() print(dog.speak()) # Output: Woof!</code>
이 예에서 Dog
자신의 구현을 제공하는 Animal
의 speak
방법을 무시합니다.
메소드 과부하 : 메소드 과부하는 일반적으로 이름이 동일하지만 다른 매개 변수로 여러 메소드를 정의하는 기능을 나타냅니다. 그러나 Python은 전통적인 의미에서 방법 과부하를 지원하지 않습니다. 대신, Python은 기본 인수 값 이라는 기술을 사용하여 메소드 과부하를 시뮬레이션합니다.
예:
<code class="python">class Calculator: def add(self, a, b=0, c=0): return abc calc = Calculator() print(calc.add(1)) # Output: 1 print(calc.add(1, 2)) # Output: 3 print(calc.add(1, 2, 3)) # Output: 6</code>
이 예에서 add
메소드는 제공된 인수 수에 따라 다르게 동작하여 메소드 과부하를 시뮬레이션합니다.
요약하면, 메소드 재정의는 하위 클래스에서 메소드를 재정의하는 것인데, 기본 인수를 통해 Python의 메소드 과부하가 달성되므로 단일 메소드가 다른 매개 변수 세트를 처리 할 수 있습니다.
위 내용은 파이썬의 상속은 무엇입니까? 여러 상속을 어떻게 구현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!