Python의 슈퍼 인수
이 문서의 주제는 Python super
인수를 올바르게 사용하는 것입니다. 또한 super
및 상속의 개념, super
인수를 사용하는 코드의 적절한 예 및 기본 클래스의 개념에 대해 배웁니다.
Python의 슈퍼 인수
Python에서 super
는 다른 클래스의 메서드를 호출합니다. 클래스가 다른 클래스로부터 물려받은 경우 이를 상위 클래스, 기본 클래스 또는 수퍼 클래스라고 합니다.
super
를 사용하는 것은 매우 간단합니다. 부모 클래스로 직접 이동하여 메서드를 호출하기 때문입니다.
인수는 super
로 전달될 수 있습니다. 클래스와 클래스 인스턴스라는 두 개의 인수를 사용합니다.
예제 코드:
class A:
def roo(self):
return "roo() from A"
class B(A):
def roo(self):
print("roo() from B")
return super().roo()
class C(A):
def roo(self):
print("roo() from C")
return super().roo()
class D(B, C):
def roo(self):
print("roo() from D")
return super(C, self).roo()
a = A()
b = B()
c = C()
d = D()
print(a.roo())
print(b.roo())
print(c.roo())
print(d.roo())
출력:
roo() from A
roo() from B
roo() from A
roo() from C
roo() from A
roo() from D
roo() from A
Super는 상속 개념을 사용합니다.
개체 지향 프로그래밍 개념에 익숙하지 않은 경우 상속이 생소하게 보일 수 있습니다. 개체 지향 프로그래밍에서 상속은 속성과 동작을 다시 구현하지 않고 다른 클래스에서 파생(또는 상속)하는 클래스의 기능을 나타냅니다.
이러한 개념을 이해하는 편리한 방법은 코드를 보는 것이므로 일부 모양을 설명하는 클래스를 만들어 봅시다.
예제 코드:
class Rectangle_Shape:
def __init__(self, len, wid):
self.length = len
self.width = wid
def area(self):
return self.length * self.width
def perimeters(self):
return 2 * self.length + 2 * self.width
class Square_Shape:
def __init__(self, len):
self.length = len
def area(self):
return self.length * self.length
def perimeters(self):
return 4 * self.length
s = Square_Shape(4)
print(s.area())
r = Rectangle_Shape(3, 5)
print(r.area())
이 클래스에는 Rectangle_Shape
및 Square_Shape
라는 두 개의 해당 클래스가 있습니다.
출력:
16
15
이 예는 서로 관련된 두 가지 모양을 보여줍니다. 정사각형은 직사각형의 한 유형입니다. 코드는 해당 관계를 반영하지 않으므로 본질적으로 반복되는 코드가 됩니다.
상속을 사용하면 직사각형과 정사각형 사이의 실제 관계를 반영하는 동시에 작성하는 코드의 양을 줄일 수 있습니다.
예제 코드:
class Rectangle_Shape:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
def perimeters(self):
return 2 * self.length + 2 * self.width
# Making the Square_Shape class that initiates the Rectangle_Shape class
class Square_Shape(Rectangle_Shape):
def __init__(self, len):
super().__init__(len, len)
s = Square_Shape(4)
print(s.area())
이 경우 super()
는 Rectangle_Shape
클래스의 init()
를 호출하고 코드를 다시 작성할 필요 없이 Square_Shape
클래스에서 사용됩니다.
출력:
16
예에서 볼 수 있듯이 Rectangle_Shape
는 상위 클래스이고 Square_Shape
는 하위 클래스입니다.
Python에서 슈퍼 인수의 정확한 사용
클래스 M
, N
및 O
에 대한 코드는 다음과 같습니다.
class M:
def __init__(self):
print("M initiated successfully")
class N(M):
def __init__(self):
super().__init__()
print("N initiated successfully")
class O(N):
def __init__(self):
super(O, self).__init__()
print("O initiated successfully")
o = O()
위의 코드에서 가정한 것처럼 모든 클래스는 직계 부모 init()
메서드를 오버로드합니다. super()
에는 속성이 필요하지 않으므로 인수 없이 사용하면 충분합니다.
출력:
M initiated successfully
N initiated successfully
O initiated successfully
클래스 M2
가 N
의 init()
메서드를 건너뛰고 대신 M
의 init()
메서드를 실행하기를 원한다고 가정합니다. init()
메서드는 우리 클래스의 직계 부모가 N
임에도 불구하고 N
이 아닌 M
에서 상속되어야 합니다.
여기 클래스 M2
가 있습니다. 그 실행을 살펴보자.
class M:
def __init__(self):
print("M initiated successfully")
class N(M):
def __init__(self):
super().__init__()
print("N initiated successfully")
class O(N):
def __init__(self):
super(O, self).__init__()
print("O initiated successfully")
class M2(N):
def __init__(self):
super(N, self).__init__()
print("other O initiated successfully")
m2 = M2()
이번에는 올바른 수퍼 클래스를 선택하기 위해 super()
메서드에 속성을 전달한다고 위의 코드에서 가정할 수 있습니다. m2 = M2()
를 실행한 결과 다음과 같은 출력을 얻습니다.
M initiated successfully
other O initiated successfully
직접 부모 __init__()
메서드를 호출하는 대신 M
의 init()
Python 메서드를 대신 호출했습니다.
이러한 명령문 또는 super()[name]
, super()
와 같은 연산자를 사용하는 암시적 조회의 경우 super()
는 정의되지 않습니다.
또한 super()
는 제로 인수 형식 외에 내부 메서드 사용에 제한되지 않습니다. 인수가 두 개인 형식을 사용하면 인수를 정확하게 식별하고 적절한 참조를 만듭니다.
클래스 정의에서 제로 인수는 컴파일러가 클래스와 인스턴스를 검색하는 데 필요한 세부 정보를 채우기 때문에 작동합니다.
Super를 사용하여 Python 다중 상속에서 생성자에 인수 전달
일반적으로 다양한 상속을 처리하는 경우 기본 클래스는 다중 상속을 위해 설계되어야 합니다.
두 클래스의 매개변수 이름이 비슷한 경우가 있습니다. 이 경우 **kwargs
에서 키-값 쌍을 제거하거나 *args
에서 제거할 수 없습니다.
개체와 달리 인수를 흡수/무시하는 Base
클래스를 정의할 수 있습니다.
예제 코드:
class Base(object):
def __init__(self, *args, **kwargs):
pass
class P(Base):
def __init__(self, *args, **kwargs):
print("P")
super(P, self).__init__(*args, **kwargs)
class Q(Base):
def __init__(self, *args, **kwargs):
print("Q")
super(Q, self).__init__(*args, **kwargs)
class R(P):
def __init__(self, arg, *args, **kwargs):
print("R", "arguments=", arg)
super(R, self).__init__(arg, *args, **kwargs)
class S(Q):
def __init__(self, arg, *args, **kwargs):
print("S", "arguments=", arg)
super(S, self).__init__(arg, *args, **kwargs)
class T(R, S):
def __init__(self, arg, *args, **kwargs):
print("T", "arguments=", arg)
super(T, self).__init__(arg, *args, **kwargs)
print("MRO---", [x.__name__ for x in T.__mro__])
t = T(10)
출력:
T arguments= 10
R arguments= 10
P
S arguments= 10
Q
MRO--- ['T', 'R', 'P', 'S', 'Q', 'Base', 'object']
이것이 작동하려면 Base
가 MRO
에서 두 번째 클래스여야 한다는 점에 유의하는 것이 중요합니다.
Python 프로그래밍 언어는 객체 지향 프로그래밍을 위한 다양한 기능을 제공합니다. 이 집합에서 super
함수 인수는 특히 올바르게 사용될 때 중요한 역할을 합니다.
이 기사가 Python에서 super
함수 인수를 사용하는 방법을 더 잘 이해하는 데 도움이 되었기를 바랍니다.
My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.
LinkedIn