>source

상속 및 사용에 관한 Python 문서를 읽었습니다. __new____init__

https://docs.python.org/3/reference/datamodel.html#basic-customization

내 모든 프로젝트에 공통된 모든 기본 메서드가있는 일반 클래스가 될 클래스 'config'를 만들려고합니다.

from abc import ABCMeta, abstractmethod
class MyConfig(metaclass=ABCMeta):
    def __new__(cls, *args, **kwargs):
        print("Config new")
        return cls
    def __init__(self):
        print("Config init")

그런 다음 새 프로젝트를 만들 때 해당 일반 config 클래스를 만들고 해당 프로젝트에 대한 특정 구성 클래스를 만듭니다.

# from config import MyConfig
class MyConfiguration(MyConfig):
    def __init__(self, *args, **kwargs):
        super(MyConfiguration, self).__init__(*args, **kwargs)
        print("Configuration init")

내 구성을 인스턴스화 할 때 두 가지를 모두 지정합니다. __new____init__ 실행할 메서드이지만 실행 만 __new__

c = MyConfiguration()

다음은 출력입니다.

Config new

문서 내용 :

If __new__() 객체 생성 중에 호출되고 cls의 인스턴스 또는 하위 클래스를 반환 한 다음 새 인스턴스의 __init__() 메소드는 다음과 같이 호출됩니다. __init__(self[, ...]) 여기서 self는 새 인스턴스이고 나머지 인수는 객체 생성자에 전달 된 것과 동일합니다.

If __new__() cls의 인스턴스를 반환하지 않은 다음 새 인스턴스의 __init__() 메소드가 호출되지 않습니다.

유일한 출력은 __new__ 방법, 즉 내가 뭔가 잘못하고 있음을 의미합니다. __init__ 메서드가 호출되지 않습니다.

어떤 도움이라도 환영합니다.

  • 답변 # 1

    __init__() 당신의 경우에만 호출됩니다 __new__() 유효하게 호출 될 수있는 무언가를 반환합니다. 즉, 클래스의 인스턴스입니다.

    귀하의 예에서는 클래스 자체를 반환하고 있습니다.

    이것이 당신이 할 수있는 한 가지 방법입니다. 클래스의 인스턴스를 만들고 클래스 자체를 반환하는 대신 반환하려면 :

    from abc import ABCMeta, abstractmethod
    class MyConfig(metaclass=ABCMeta):
          def __new__(cls, *args, **kwargs):
                instance = super(MyConfig, cls).__new__(cls, *args, **kwargs)
                print("Config new")
                return instance
          
          def __init__(self, *args, **kwargs):
                print("Config init")
    class MyConfiguration(MyConfig):
          def __init__(self, *args, **kwargs):
                super(MyConfiguration, self).__init__(*args, **kwargs)
                print("Configuration init")
            
    if __name__ == '__main__':
          c = MyConfiguration()
    
    

    산출:

    Config new
    Config init
    Configuration init
    
    

관련 자료

  • 이전 c++ - 숫자를 분해 할 때 출력에 추가 "0"
  • 다음 doctrine orm - v10, MYSQLI_SERVER_PUBLIC_KEY의 업데이트 실패