72

이 질문에는 이미 답변이 있습니다.

파이썬 클래스가있는 경우 :

class BaseClass(object):
#code and the init function of the base class

그리고 나서 다음과 같은 하위 클래스를 정의합니다.

class ChildClass(BaseClass):
#here I want to call the init function of the base class

기본 클래스의 init 함수가 자식 클래스의 init 함수 인수로 가져 오는 인수를 사용하는 경우이 인수를 기본 클래스에 전달하는 방법은 무엇입니까?

내가 작성한 코드는 다음과 같습니다.

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):
    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super(ElectricCar, self).__init__(model, color, mpg)

내가 어디로 잘못 가고 있니?


  • 형식이 잘못되었습니다. 복사 및 붙여 넣기에 문제가 있습니까? 파이썬은 잘못된 형식으로 껍질을 벗깁니다. - Mingyu
  • @ Mingyu 형식이 잘못 되었나요? 들여 쓰기를 의미합니까, 아니면 다른 것을 놓치고 있습니까? - Prakhar Mohan Srivastava
  • 네. 나는 들여 쓰기를 의미합니다. 내 대답을 아래에서보십시오. - Mingyu

4 답변


86

너는 사용할 수있어.super(ChildClass, self).__init__()

class BaseClass(object):
    def __init__(self, *args, **kwargs):
        pass

class ChildClass(BaseClass):
    def __init__(self, *args, **kwargs):
        super(ChildClass, self).__init__(*args, **kwargs)

들여 쓰기가 잘못되었습니다. 수정 된 코드는 다음과 같습니다.

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):
    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super(ElectricCar, self).__init__(model, color, mpg)

car = ElectricCar('battery', 'ford', 'golden', 10)
print car.__dict__

결과는 다음과 같습니다.

{'color': 'golden', 'mpg': 10, 'model': 'ford', 'battery_type': 'battery'}


  • 통과하면BaseClasssuper, 건너 뜁니다.BaseClass전화object.__init__이것은 당신이 원하는 것이 거의 확실하지 않습니다. - abarnert
  • 한편, OP 코드의 잘못된 점은 그의 들여 쓰기뿐입니다.super(정확하게 설명했다해도 도움을 줄 수는 없지만 특히 이미 똑같은 방식으로 사용했다는 점을 감안할 때 도움이되지 않았습니다. 사실, 그것은 동일 문자입니다. - abarnert
  • 고마워요, @abarnert. 처음에 그는 코드를 게시하지 않았고 그가 질문 한 질문은 제목에있는 질문입니다. - Mingyu

23

Mingyu가 지적했듯이 서식을 지정하는 데 문제가 있습니다. 그것 이외에, 나는 강력히 추천 할 것이다.파생 클래스의 이름을 사용하지 않습니다.전화하는 동안super()코드가 유연하지 못하기 때문에 (코드 유지 관리 및 상속 문제). Python 3에서 사용super().__init__대신. 다음은 이러한 변경 사항을 통합 한 후의 코드입니다.

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):

    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super().__init__(model, color, mpg)

Erwin Mayer가이 문제를 지적 해 주신 덕분에__class__super ()


  • 추천에 대한 설명을 파생 클래스의 이름을 사용하지 않을 수 있습니까? ' - jwg
  • @jwg 이유를 설명하는 답변을 업데이트했습니다.수업더 나은 선택입니다. - Craig Finch
  • @CraigFinch는 self .__ class__를 사용하는 것이 전혀 좋은 생각이 아닌 것 같습니다. 파이썬 3에서는 단순히 super () .__ init__ - Erwin Mayer
  • Py3가 Py2보다 우월한 또 다른 이유입니다. (3.4가 나온 후에 파이썬에 온 누군가로서) - Marc

9

수퍼 클래스의 생성자를 다음과 같이 호출 할 수 있습니다.

class A(object):
    def __init__(self, number):
        print "parent", number

class B(A):
    def __init__(self):
        super(B, self).__init__(5)

b = B()

노트:

부모 클래스가 상속 할 때만 작동합니다.object


7

파이썬 3을 사용한다면, 인자없이 간단히 super ()를 호출하는 것이 좋습니다 :

class Car(object):
    condition = "new"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):
    def __init__(self, battery_type, model, color, mpg):
        self.battery_type=battery_type
        super().__init__(model, color, mpg)

car = ElectricCar('battery', 'ford', 'golden', 10)
print car.__dict__

슈퍼와 통화하지 마세요.수업에 따라 무한 재귀 예외가 발생할 수 있으므로이 대답.

연결된 질문


관련된 질문

최근 질문