본문 바로가기
Python/파이썬 기초

클래스(class)와 어트리뷰트(attribute)와 관련된 내장함수 - 파이썬 기초(15)

by 콩돌 2018. 12. 20.
반응형

참고 자료

https://docs.python.org/3/library/functions.html


파이썬 버전 3.7 기준



클래스(class)와 어트리뷰트(attribute)와 관련된 내장함수


본 포스팅에서 다루는 함수는 다음과 같다.

type(), object(), super(), isinstance(), issubclass(), var(), setattr(), getattr(), delattr(), hasattr(), property(), callable() 등.



오브젝티브를 생성해주는 내장함수


type(x) or type(name, bases,dict)

  ○ 입력되는 x의 자료형을 반환한다.

  ○ x.__class__가 반환하는 것과 같은 객체이다.

  ○ 실제 객체를 자료형을 알기 위해서는 isinstance() 내장 함수가 권장되는데, 이 함수는 서브클래스를 고려하기 때문이다.


  ○ 세 개의 인자가 입력으로 들어가면, 새로운 타입의 객체를 반환한다.

    ▷ 이 것은 본래 class구문의 동적인 형태라고 볼 수 있다.

    ▷ 다음 예제 구문에서 봤을 때 class 구문으로 작성된 X와 type 구문으로 작성된 G는 거의 동일하다고 볼 수 있다.

    ▷ name 값은 클래스 이름이며 __name__ 어트리뷰트에 대응되고, bases 튜플은 베이스 클래스들을 항목화하며 __bases__ 어트리뷰트가 되고, dict 딕셔너리는 클래스 바디의 정의들이 들어있는 이름 공간이며 __dict__ 어트리뷰트가 되도록 표준 딕셔너리에 복사된다. 


In[2]: class X:

    ...:    a = 1

    ...:    

In[3]: G = type('G', (object,), dict(a=1))


object()

  ○ 기능이 없는 새로운 오브젝트(클래스)를 반환한다.

  ○ object()는 모든 클래스의 베이스 클래스이며, 모든 파이썬 클래스의 인스턴스에 공통적인 메서드를 포함하고 있다.

  ○ 이 함수는 입력이 없다.


상속 혹은 서브클래스와 관련된 내장함수


super([type[, object-or-type]])

  ○ 메서드 호출을 type의 부모나 형제 클래스에 위임하는 프록시 객체를 반환한다.

    ▷ 이 함수는 상속되었긴 하지만 클래스 내에서 재정의가 되어버린 메서드에 접근할 때 유용하다.

    ▷ 쉽게 설명하면 자신의 메서드가 아니라 부모나 형제 클래스에 있는 메서드에 접근한다.

  ○ type을 생략해서 건너뛸 수 있다는 점을 제외하면 getattr()과 상당히 유사한 작업을 수행한다.

  ○ 아래에 super()함수의 간단한 사용 예가 있다.
    ▷ x_son 클래스는 x의 하위 클래스이므로 x의 메서드에 접근할 수 있으나, b라는 메서드가 재정의 되었으므로 x클래스의 b()메서드를 바로 불러오는건 어렵다.
    ▷ 이 경우 super()함수를 적용함으로써 상위 클래스인 x의 b메서드에 접근을 할 수 있다.

사용 예)
In[20]: class x: 
     ...:     a = 10
     ...:     def b(self):
     ...:         return 20
     ...:     
In[21]: class x_son(x):
     ...:     a = 100
     ...:     def b(self):
     ...:         return 200
     ...:     def c(self):
     ...:         return super().b()      # same as super(x_son, self).b() 
     ...:         
In[22]: y_son =x_son()
In[23]: y_son.c()
Out[23]: 20
  ※ super()함수에 대한 자세한 사용 법은 https://rhettinger.wordpress.com/2011/05/26/super-considered-super/에 잘나와있다.

isinstance(object, classinfo)

  ○ object 인자가 classinfo 인자이거나 혹은 classinfo의 서브 클래스의 인스턴스면 True를 반환한다.

  ○ object 인자가 형의 객체가 아니면, 항상 False을 반환한다.


issubclass(class, classinfo)

  ○ class가 classinfo의 서브클래스인 경우 True를 반환한다. 임의의 클래스는 그 자체가 자신의 서브클래스로 여겨진다. 


사용 예)

In[2]: class x:

    ...:     a=10

    ...:

In[3]: class x_son(x):

    ...:     b=10

    ...: 

In[4]: isinstance(x.a, int)

Out[4]: True

In[5]: issubclass(x,x_son)

Out[5]: False

In[6]: issubclass(x_son,x)

Out[6]: True



어트리뷰트(attribute)와 관련된 내장함수


dir([object])

  ○ 인자가 입력되지 않은 경우 현재 지역에 있는 변수, 클래스, 함수 등의 리스트를 반환한다.

  ○ 인자가 있는 경우, 해당 객체의 유효한 어트리뷰트들의 리스트를 반환한다. 

    ▷ 객체에 __dir__() 메서드가 있는 경우 이 메서드를 호출한다. 다만 반드시 어트리뷰트 리스트를 반환해야한다.

    ▷ 객체에 __dir__() 메서드가 없는 경우는 직접 어트리뷰트의 리스트를 반환하려 시도한다. 다만 결과는 완전하지 않고, 객체가 __getattr__() 메서드를 가질 경우 부정확할 가능성도 존재한다.


vars([object])

  ○ 모듈, 클래스, 인스턴스 또는 __dict__ 어트리뷰트가 있는 다른 객체의 __dict__ 어트리뷰트를 반환한다. 

  ○ 모듈이나 인스턴스 같은 객체는 업데이트가 가능한 __dict__ 어트리뷰트를 가진다. 그러나 다른 객체는 __dict__어트리뷰트에 쓰기 제한을 가질 수도 있다.

  ○ 인자가 없는경우 locals와 같이 작동한다.


setattr(object, name, value)

  ○ 위의 type과 유사하지만, 입력하려는 object를 미리 정의해야하는 면이 다르다.

  ○ 기존에 존재하는 어트리뷰트에 값을 대입하거나, 새로운 어트리뷰트를 만들어 값을 대입한다.

  ○ 사실상 setattr(x, 'a', 1)과 x.a=1은 동일하다.


getattr(object, name[, default])

  ○ setattr함수와는 조금 다르게 기존의 어트리뷰트가 존재하는 경우 그 값을 출력한다.  

  ○ Default값이 주어질 경우 어트리뷰트가 존재하지 않으면 Default를 출력하나, 만약 Default가 입력되지 않은 상황에서 어트리뷰트가 존재하지 않는 경우 에러를 일으킨다.


delattr(object, name)

  ○ 입력된 오브젝트에서의 어트리뷰트를 삭제한다.


hasattr(object, name)

  ○ 입력된 오브젝트에 어트리뷰트가 존재하면 True를 존재하지 않으면 False을 반환한다.


사용 예)

In[79]: class x:

      ...: ob=1

      ...: 

In[80]: setattr(x,'gg',222)

In[81]: x.gg

Out[81]: 222

...

In[82]: getattr(x, 'gg', 'No attr')

Out[82]: 222

In[83]: getattr(x, 'kk', 'No attr')

Out[83]: 'No attr'

In[84]: hasattr(x, 'gg')

Out[84]: True

In[85]: hasattr(x, 'kk')

Out[85]: False

In[86]: delattr(x, 'ob')

In[87]: hasattr(x, 'ob')

Out[87]: False



property 내장함수


※ 파이썬에서 클래스를 작성할 때 두개의 언더스코어(__)를 사용하여 클래스 내부 변수를 만들경우 클래스내부에 내부적으로는 사용이 가능하지만 외부에서는 접근이 어려운 형태로 클래스 내부 변수를 생성한다(접근이 가능하긴 하다.). 이 변수를 외부에서 접근 및 수정이 용이하게 만들어 줄 수 있는데 property()함수를 이용하면된다. 비공개 변수에 대한 설명은 여기를 참고한다.


property(fget=None, fset=None, fdel=None, doc=None)

  ○ 각 입력 별 내용은 다음과 같다.

    ▷ fget은 어트리뷰트 값을 얻는 함수이다.

    ▷ fset은 어트리뷰트 값을 설정하는 함수이다.

    ▷ fdel은 어트리뷰트 값을 삭제하는 함수이다.

    ▷ doc는 어트리뷰트의 독스트링을 만든다. 

  ○ property()의 사용 방법은 다음과 같다.


사용 예 1)

In[56]: class G:

     ...:    def __init__(self):

     ...:        self.__x = None

     ...:    def getx(self):

     ...:        return self.__x

     ...:    def setx(self, value):

     ...:        self.__x = value

     ...:    def delx(self):

     ...:        del self.__x

     ...:    x = property(getx, setx, delx, "This is 'x' property.")

     ...: 

In[57]: y=G()

In[58]: y.getx()

In[59]: y.setx(50)

In[60]: y.getx()

Out[60]: 50

In[61]: y.__x

AttributeError: 'G' object has no attribute '__x'



  ○ property() 함수를 사용하지 않고 데코레이터를 통해 같은 작업을 수행할 수 있다.

사용 예 2)

In[70]: class G:

     ...:    def __init__(self):

     ...:        self.__x = None

     ...:    @property

     ...:    def x(self):

     ...:        return self.__x

     ...:    @x.setter

     ...:    def x(self, value):

     ...:        self.__x = value

     ...:    @x.deleter

     ...:    def x(self):

     ...:        del self.__x

     ...: 

In[71]:y = G()

In[72]: y.x = 50

Change x value

In[73]: y.x

Out[73]: 50

In[74]: y.__x

AttributeError: 'G' object has no attribute '__x'



기타 내장함수


callable(object)

  ○ object 인자가 불러올 수 있을 거같은 경우에 True을 아니면 False을 반환한다.

  ○ True값을 돌려주더라도 불러오기에 실패할 가능성이 존재하지만, False일 경우에는 반드시 실패한다.



반응형

댓글