Programing

Python : __init__ 수퍼 클래스 상속

crosscheck 2021. 1. 6. 20:17
반응형

Python : __init__ 수퍼 클래스 상속


많은 __init__인수가 있는 기본 클래스가 있습니다 .

def BaseClass(object):
    def __init__(self, a, b, c, d, e, f, ...):
        self._a=a+b
        self._b=b if b else a
        ...

모든 상속 클래스는 __init__기본 클래스의 메서드를 실행해야합니다 .

__init__()수퍼 클래스를 호출하는 각 상속 클래스에 메서드를 작성할 수 __init__있지만 이는 심각한 코드 중복입니다.

def A(BaseClass):
    def __init__(self, a, b, c, d, e, f, ...):
        super(A, self).__init__(a, b, c, d, e, f, ...)

def B(BaseClass):
    def __init__(self, a, b, c, d, e, f, ...):
        super(A, self).__init__(a, b, c, d, e, f, ...)

def C(BaseClass):
    def __init__(self, a, b, c, d, e, f, ...):
        super(A, self).__init__(a, b, c, d, e, f, ...)

...

슈퍼 클래스를 자동으로 호출하는 가장 파이썬적인 방법은 무엇입니까 __init__?


super(SubClass, self).__init__(...)

* args 및 ** kw가 변수 악몽을 해결하는 데 도움이된다면 사용을 고려하십시오.


명시 적으로 작성해야하지만 반면에 인수가 많으면 위치 인수에 * args를 사용하고 키워드 인수에 ** kwargs를 사용해야합니다.

class SubClass(BaseClass):
    def __init__(self, *args, **kwargs):
        super(SubClass, self).__init__(*args, **kwargs)
        # SubClass initialization code

사용할 수있는 또 다른 기술은 init 에서 코드를 최소화 한 다음 init 함수 의 끝에서 다른 사용자 지정 함수를 호출하는 것입니다. 그런 다음 하위 클래스에서 사용자 지정 함수를 재정의하면됩니다.

class BaseClass(object):
    def __init__(self, *args, **kwargs):
        # initialization code
        self._a = kwargs.get('a')
        ...
        # custom code for subclass to override
        self.load()

    def load():
        pass

class SubClass(BaseClass)
    def load():
        # SubClass initialization code
        ...

파생 클래스가 기본 클래스가 __init__()이미 수행하는 것 이상으로 구현하지 않는 경우 파생 클래스 __init__()메서드를 생략 하면 기본 클래스 __init__()가 자동으로 호출됩니다.

OTOH, 파생 클래스가에 추가 작업을 추가 __init__()하고 기본 클래스를 명시 적으로 호출하지 않도록 __init__()하려면 다음을 수행 할 수 있습니다.

class BaseClass(object):
    def __new__(cls, a, b, c, d, e, f, ...):
        new = object.__new__(cls)
        new._a=a+b
        new._b=b if b else a
        ...
        return new

class A(BaseClass):
    ''' no __init__() at all here '''

class B(BaseClass):
    def __init__(self, a, b, c, d, e, f, ...):
        ''' do stuff with init params specific to B objects '''

__new__()는 항상 자동으로 호출 되기 때문에 파생 클래스에서 추가 작업이 필요하지 않습니다.


Unless you are doing something useful in the subclass __init__() methods, you don't have to override it.

def BaseClass(object):
    def __init__(self, a, b, c, d, e, f, ...):
        self._a=a+b
        self._b=b if b else a
        ...

def A(BaseClass):
    def some_other_method(self):
        pass

def B(BaseClass):
    pass

Perhaps a clearer implementation for your case is using **kwargs combined with new added arguments in your derived class as in:

class Parent:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c


class Child(Parent):
    def __init__(self, d, **kwargs):
        super(Child, self).__init__(**kwargs)
        self.d = d

By this method you avoid the code duplication but preserve the implicit addition of arguments in your derived class.


In 2.6 and lower version to inherit init from base class, there is no super function, You can inherit below way:

class NewClass():
     def __init__():
         BaseClass.__init__(self, *args)

Adding a Pythonic implementation. Assuming you want all attributes passed in, you can use the code below. (Can also keep/remove specific kwargs keys if you want a subset).

def A(BaseClass):
    def __init__(self, *args, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

base = BaseClass(...)
new = A( **base.__dict__ )

ReferenceURL : https://stackoverflow.com/questions/6535832/python-inherit-the-superclass-init

반응형