[python] 자식 클래스에서 부모 클래스의 메서드를 호출합니까?

파이썬에서 간단한 객체 계층을 만들 때 파생 클래스에서 부모 클래스의 메서드를 호출 할 수 있기를 원합니다. Perl과 Java에는이 키워드 ( super)에 대한 키워드가 있습니다. Perl에서는 다음과 같이 할 수 있습니다.

package Foo;

sub frotz {
    return "Bamf";
}

package Bar;
@ISA = qw(Foo);

sub frotz {
   my $str = SUPER::frotz();
   return uc($str);
}

파이썬에서는 자식 클래스에서 부모 클래스의 이름을 명시 적으로 지정해야합니다. 위의 예에서와 같은 작업을 수행해야합니다 Foo::frotz().

이 동작으로 인해 깊은 계층 구조를 만드는 것이 어려워지기 때문에 이것은 옳지 않은 것 같습니다. 자녀가 상속받은 메소드를 정의한 클래스를 알아야하는 경우 모든 종류의 정보 고통이 발생합니다.

이것은 파이썬의 실제 제한입니까, 이해의 차이입니까, 아니면 둘 다입니까?



답변

네,하지만 새로운 스타일의 클래스 에서만 가능 합니다. super()기능을 사용하십시오 :

class Foo(Bar):
    def baz(self, arg):
        return super().baz(arg)

python <3의 경우 다음을 사용하십시오.

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)


답변

파이썬에는 슈퍼 도 있습니다.

super(type[, object-or-type])

메서드 호출을 부모 또는 형제 유형의 클래스에 위임하는 프록시 객체를 반환합니다. 클래스에서 재정의 된 상속 된 메서드에 액세스하는 데 유용합니다. 검색 순서는 유형 자체를 건너 뛰는 것을 제외하고 getattr ()에서 사용 된 것과 동일합니다.

예:

class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()


답변

ImmediateParentClass.frotz(self)

직계 부모 클래스가 frotz자체적으로 정의했는지 아니면 상속 했는지에 관계없이 괜찮 습니다. 다중 상속 super을 올바르게 지원하는 데만 필요합니다 (그리고 모든 클래스가 올바르게 사용하는 경우에만 작동합니다). 일반적으로 정의하지 않거나 재정의하지 않으면 조상 을 찾아 볼 것 입니다. 이는 “자식을 호출하는 부모 클래스의 메소드”에 대해서도 발생합니다.AnyClass.whateverwhateverAnyClassAnyClass


답변

파이썬 3 은 부모 메소드를 호출하기위한 다른 간단하고 간단한 구문을 가지고 있습니다.

Foo클래스가에서 상속받은 경우 Bar다음 Bar.__init__Foo통해 from 을 호출 할 수 있습니다 super().__init__().

class Foo(Bar):

    def __init__(self, *args, **kwargs):
        # invoke Bar.__init__
        super().__init__(*args, **kwargs)


답변

많은 답변이 자식에서 재정의 된 부모로부터 메서드를 호출하는 방법을 설명했습니다.

하나

“자식 클래스에서 부모 클래스의 메소드를 어떻게 호출합니까?”

또한 의미 할 수 있습니다 :

“상속 된 메소드를 어떻게 호출합니까?”

덮어 쓰지 않는 한 자식 클래스의 메서드 인 것처럼 부모 클래스에서 상속 된 메서드를 호출 할 수 있습니다.

예를 들어 파이썬 3 :

class A():
  def bar(self, string):
    print("Hi, I'm bar, inherited from A"+string)

class B(A):
  def baz(self):
    self.bar(" - called by baz in B")

B().baz() # prints out "Hi, I'm bar, inherited from A - called by baz in B"

그렇습니다. 이것은 상당히 분명 할 수 있지만 사람들이 지적하지 않으면 사람들이 파이썬에서 상속 된 메소드에 액세스하기 위해 어리석은 농구 대를 뛰어 넘어야한다는 인상을 남길 수 있다고 생각합니다. 특히이 질문은 “파이썬에서 부모 클래스의 메소드에 액세스하는 방법”에 대한 검색에서 높은 평가를 받고 OP는 파이썬을 처음 접하는 사람의 관점에서 작성됩니다.

상속 된 메소드에 액세스하는 방법을 이해하는 데 유용한 https://docs.python.org/3/tutorial/classes.html#inheritance 를 찾았습니다
.


답변

다음은 super () 사용 예입니다 .

#New-style classes inherit from object, or from another new-style class
class Dog(object):

    name = ''
    moves = []

    def __init__(self, name):
        self.name = name

    def moves_setup(self):
        self.moves.append('walk')
        self.moves.append('run')

    def get_moves(self):
        return self.moves

class Superdog(Dog):

    #Let's try to append new fly ability to our Superdog
    def moves_setup(self):
        #Set default moves by calling method of parent class
        super(Superdog, self).moves_setup()
        self.moves.append('fly')

dog = Superdog('Freddy')
print dog.name # Freddy
dog.moves_setup()
print dog.get_moves() # ['walk', 'run', 'fly']. 
#As you can see our Superdog has all moves defined in the base Dog class


답변

파이썬에는 super ()도 있습니다. 파이썬의 구식과 새로운 스타일의 클래스 때문에 약간 까다 롭지 만 생성자에서 매우 일반적으로 사용됩니다.

class Foo(Bar):
    def __init__(self):
        super(Foo, self).__init__()
        self.baz = 5