Python의 슈퍼 인수

Abid Ullah 2023년6월21일
  1. Python의 슈퍼 인수
  2. Super는 상속 개념을 사용합니다.
  3. Python에서 슈퍼 인수의 정확한 사용
  4. Super를 사용하여 Python 다중 상속에서 생성자에 인수 전달
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_ShapeSquare_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, NO에 대한 코드는 다음과 같습니다.

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

클래스 M2Ninit() 메서드를 건너뛰고 대신 Minit() 메서드를 실행하기를 원한다고 가정합니다. 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__() 메서드를 호출하는 대신 Minit() 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']

이것이 작동하려면 BaseMRO에서 두 번째 클래스여야 한다는 점에 유의하는 것이 중요합니다.

Python 프로그래밍 언어는 객체 지향 프로그래밍을 위한 다양한 기능을 제공합니다. 이 집합에서 super 함수 인수는 특히 올바르게 사용될 때 중요한 역할을 합니다.

이 기사가 Python에서 super 함수 인수를 사용하는 방법을 더 잘 이해하는 데 도움이 되었기를 바랍니다.

작가: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

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

관련 문장 - Python Argument