클래스 객체와 인스턴스 객체의 관계
-
인스턴스 객체가 어떤 클래스로부터 생성됐는지 확인하는 방법으로
isinstance()
내장 함수를 사용할 수 있다. -
클래스 객체를 정의할 때 어떠한 상속을 받지 않더라도
버전3 이후
로는 암묵적으로object 객체
를 상속한다. -
자료형 또한
object 객체
에서 파생된다.
>>> class Person:
... pass
>>> class Bird:
... pass
>>> class Student(Person):
... pass
>>> p,s = Person(), Student()
>>> print("p is instance of Person: " , isinstance(p,Person))
p is instance of Person: True
>>> print("s is instance of Person: " , isinstance(s,Person))
s is instance of Person: True
>>> print("p is instance of object: " , isinstance(p , object))
p is instance of Object: True
>>> print("p is instance of Bird: " , isinstance(p , Bird))
p is instance of Bird: False
>>> print("int is instance of object: " , isinstance(int , object))
int is instance of object: True
생성자, 소멸자 메서드
-
생성자 메서드
는인스턴스 객체
가생성
될 때 자동으로 호출 -
소멸자 메서드
는인스턴스 객체
의레퍼런스 카운터
가 ‘0’이 될 때 호출 -
클래스 내부적으로 이를 지원하기 위해 생성자 메서드는
__init__()
, 소멸자 메서드는__del__()
로 미리 정의되어 있다. -
파이썬에서 변수나 함수명 앞뒤로
__
가 있는 경우 특별한 용도로 미리 정의된 것이다.
class MyClass:
def __init__(self, value):
self.Value = value
print("Class is created! Value = ", value)
def __del__(self):
print("Class is deleted!")
def foo():
d = MyClass(10)
foo()
Class is created! Value = 10
Class is deleted!
-
MyClass 클래스는 생성 시 초기값으로 1개의 인자를 받는다.
-
클래스의 인스턴스 객체는 foo()함수의 내부에 생성되어
함수 블록을 벗어나게 되면자동
으로소멸
된다. -
따라서 foo()함수만 호출해도 객체의
생성자
와소멸자
가 호출된다.
-
명시적으로 del 구문을 사용한다고 클래스 객체의 소멸자 함수(del)가 항상 호출되는 것은 안디ㅏ.
-
인스턴스 객체를 생성한 후
레퍼런스 카운터
가 1개 이상 존재한다면 del 구문을 사용해도 소멸자는 호출되지 않는다.
>>> class MyClass:
... def __init__(self, value):
... self.Value = value
... print("Class is created! Value = ", value)
... def __del__(self):
... print("Class is deleted!")
>>> c = MyClass(10) # 인스턴스 객체 생성-생성자 호출 (레퍼런스 카운터 : 1)
Class is created! Value = 10
>>> c_copy = c # 레퍼런스 카운터 증가 : 2
>>> del c # 레퍼런스 카운터 감소 : 1
>>> del c_copy # 레퍼런스 카운터 감소 : 0 - 소멸자 호출
Class is deleted!