본문 바로가기
Python Object-oriented Programming

__new__() Method

by 자동매매 2023. 3. 31.

 

https://www.pythontutorial.net/python-oop/python-__new__/

 

Python __new__

In this tutorial, you'll learn about the Python __new__ method and understand how Python uses it to create a new object.

www.pythontutorial.net

 

파이썬 __new__ 메서드 소개

 

1. 클래스의 인스턴스를 만들  Python 먼저  __new__()  method 호출하여  객체를 생성한 다음

    __init__() method를 호출하여 객체의 속성을 초기화합니다.

 

2. __new__()는 object Class static method입니다.

 

3. [수동 객체 생성 구문]  - 수동 생성의 경우 이후 반드시 __init__()를  호출 해야 한다.

 

object.__new__(class, *args, **kwargs)

 

  • object                 : 상속 class - 모든 class는 암묵적으로 object class 상속 - supper()
  • class                  : 생성하기를 원하는 객체의 class
  • *args , **kwargs : __init__() method에 전달되는 매개변수 (서로 일치)

반환값 : new object   (꼭 그럴 필요는 없다)

 

 

4. 새 클래스를 정의할때, 

    해당 클래스는 object class클래스에서 암묵적으로 상속됩니다. 

    즉, 필요시 __new__ 정적 메서드를 overide하여 필요 작업을 수행   있습니다.

 

super().__new__(class, *args, **kwargs)

 

파이썬 __new__ 메서드 예제

 

다음은  클래스를 호출하여  객체를 만들  Python __new__  __init__ 메서드를 호출하는 순서를 보여줍니다.

 

class Person:
    def __new__(cls, name):
        print(f'Creating a new {cls.__name__} object...')
        obj = object.__new__(cls)
        return obj

    def __init__(self, name):
        print(f'Initializing the person object...')
        self.name = name


person = Person('John')

 

output

 

Creating a new Person object...
Initializing the person object...

 

 

다음은 Person 클래스를  정의하고 Person 클래스의 인스턴스를 만듭니다.

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

person = Person('John')

 

동일 기능

 

person = object.__new__(Person,'John')
person.__init__('John')

 

__dict__를 이용한 속성 확인

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

person = object.__new__(Person,'John')
# print(person.name)    # 초기화 전이므로 name속성이 초기화 x -> 에러 발생
print(person.__dict__)  # {}
person.__init__('John')
print(person.name)      # John
print(person.__dict__)  # {'name': 'John'}

 

__new__ Method을 사용하는 경우

 

다음 예제에서는  built_in int type에서 상속되는 SquareNumber 클래스를 정의합니다.

- x SquareNumber 클래스의 인스턴스이며 built_in int type 인스턴스입니다.

- __init__메서를 이용하여 이를 구현 불가능 : built-in int __init__() 메서드는 인수를 취하지 않으므로

 

class SquareNumber(int):
    def __new__(cls, value):
        return super().__new__(cls, value ** 2)


x = SquareNumber(3)
print(x)  # 9

 

에러 발생

 

class SquareNumber(int):
    def __init__(self, value):
        super().__init__(value ** 2)


x = SquareNumber(3)

 

실제로는  인스턴스화된 시간에 객체를 조정하려는 경우 __new__() 메서드를 사용합니다.

예를 들어, 다음은 Person  클래스를 정의하고 __new__메서드를  사용하여 full_name 특성을 Person 개체에 삽입합니다.

 

class Person:
    def __new__(cls, first_name, last_name):
        # create a new object
        obj = super().__new__(cls)

        # initialize attributes
        obj.first_name = first_name
        obj.last_name = last_name

        # inject new attribute
        obj.full_name = f'{first_name} {last_name}'
        return obj


person = Person('John', 'Doe')
print(person.full_name)  # John Doe

# {'first_name': 'John', 'last_name': 'Doe', 'full_name': 'John Doe'}
print(person.__dict__)

 

일반적으로 __new__() 메서드를 재정의할 __init__() 메서드에서 수행할 있는 모든 작업을 __new__() 메서드에서 수행할  있으므로 __init__() 메서드를 정의할 필요가 없습니다.

 

요약

  • __new__()object classstatic method입니다.
  • 클래스를 호출하여 새 객체를 생성하면 Python은 __new__() 메서드를 호출하여  먼저 객체를 생성한 다음 __init__() 메서드를 호출하여 객체의 속성을 초기화합니다.
  • 생성 시 객체를 조정하려는 경우 __new__() 메서드를 override(재정의)합니다.

'Python Object-oriented Programming' 카테고리의 다른 글

type Class  (0) 2023.04.01
Abstract Class  (0) 2023.03.31
super() Method  (0) 2023.03.31
Static Methods  (0) 2023.03.31
[ OOP ] Index  (0) 2023.03.31

댓글