파이썬에서 간단한 객체 계층을 만들 때 파생 클래스에서 부모 클래스의 메서드를 호출 할 수 있기를 원합니다. 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.whatever
whatever
AnyClass
AnyClass
답변
파이썬 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