Gidhub BE Developer

클래스/인스턴스 객체의 관계, 생성자/소멸자

2018-02-06
goodGid

클래스 객체와 인스턴스 객체의 관계

  • 인스턴스 객체가 어떤 클래스로부터 생성됐는지 확인하는 방법으로 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!


Comments

Content