https://www.pythontutorial.net/python-oop/python-__new__/
파이썬 __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 class의 static 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 |
댓글