Object(객체) 와 Class

kkiyou·2021년 5월 28일
0

Python

목록 보기
8/12

Object의 의미

Objectd의 정의
Any data with state (attributes or value) and defined behavior (methods).

상태(속성 또는 값)과 정의된 행동(Methods)을 가지고 있는 특정한 자료다.

예컨대 Airplane(비행기)라는 object(객체)가 있다고 가정하자. 비행기라는 object는 다음과 같은 다양한 상태(속성 또는 값)으로 나눌 수 있다.

  • 제조사(Lockheed Martin, Boeing, Airbus...)
  • 모델(Boeing 747, A380...)
  • 종류({민항기: [여객기, 물류기...]}, {군용기: [전투기, 폭격기...]} 등)

동시에 비행기는 다음과 같은 행동을 수행한다.

  • 활주(승객 착석, 화물칸 닫기, 벨트 매기, 안내방송 등)
  • 이륙(엔진 가동, 레버 당기기, 바퀴 접기 등)
  • 비행(고도 변경, 기내식 제공 등)
  • 착륙(바퀴 펴기, 엔진 정지, 벨트 풀기, 출입구 개방 등)


First Class Object(1급 객체)

  • 같은 말
    = First Class citizen
    = First Class type
    = First Class entity
    = First Class value

아래와 같은 특징을 가지고 있는 객체를 의미한다.

  • 함수의 매개변수가 될 수 있다.(All items can be the actual parameters of functions.)
  • 함수의 반환 값이 될 수 있다.(All items can be returned as results of functions.)
  • 할당문의 대상이 될 수 있다.(All items can be the subject of assignment statements.)
  • 비교의 대상이 될 수 있다.(All items can be tested for equality.)

즉 파이썬에서는 자료형(int, str, list, tuple, set, dictionary...), 변수, 함수, 클래스 등이 일급 객체다. 반면 C에서 함수의 이름은 함수의 매개변수로 전달할 수 없다. C에서 함수의 매개변수로 전달하는 것은 Pointer다.

참고자료 1



Class(클래스)

class <ClassName>:
    def __init__(self [, <parameters>]):
        self.<attribute> = <parameter>
        ...
    
    def <method>(self [, <parameters>]):
        <code>

사용자가 정의한 객체를 만들때 사용한다.

한편 int, str, list, dict, tuple 등 또한 클래스이다. 각 자료형의 type을 출력해보면 class임을 알 수 있고, help()를 사용해서 출력해보면 class int(object) 즉 클래스임을 알 수 있다.

>>> print(type(int()))
<class 'int'>
>>> print(type(str()))
<class 'str'>
>>> print(type(list()))
<class 'list'>
>>> print(type(dict()))
<class 'dict'>
>>> print(type(tuple()))
<class 'tuple'>
>>> print(type(bool()))
<class 'bool'>
>>> help(int)
Help on class int in module builtins:

class int(object)
 |  int([x]) -> integer
 |  int(x, base=10) -> integer
 |  
 |  Convert a number or string to an integer, or return 0 if no arguments
 |  are given.  If x is a number, return x.__int__().  For floating point
 |  numbers, this truncates towards zero.
  • PEP8에 따라서 Class는 단어의 첫 문자를 대문자로 하는 CapWords 포맷으로 이름짓는다.(Class names should normally use the CapWords convention.)


Always use self for the first argument to instance methods.

Always use cls for the first argument to class methods.

If a function argument's name clashes with a reserved keyword, it is generally better to append a single trailing underscore rather than use an abbreviation or spelling corruption. Thus class_ is better than clss. (Perhaps better is to avoid such clashes by using a synonym.)



@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Property

class에서 method를 통해 attribute의 값을 가져오는 method를 getter, 값을 저장하는 method를 setter라고 한다.

class Person:
    def __init__(self):
        self.__age = 0
def get_age(self):           # getter
    return self.__age

def set_age(self, value):    # setter
    self.__age = value

james = Person()
james.set_age(20)
print(james.get_age()) # 20

값을 입력받는 method에는 @property 데코레이터를 사용하고,
값을 저장하는 method에는 @<method.name>.setter 데코레이터를 사용한다. getter와 setter를 사용하면 method를 속성처럼 사용할 수 있다.

class Person:
    def __init__(self):
        self.__age = 0
@property
def age(self):           # getter
    return self.__age

@age.setter
def age(self, value):    # setter
    self.__age = value

james = Person()
james.age = 20 # 인스턴스.속성 형식으로 접근하여 값 저장
print(james.age) # 인스턴스.속성 형식으로 값을 가져옴

mro

Method Resolution Order의 약자로 메소드의 상속 순서를 반환한다.
Built-in Types

  • class.__mro__

This attribute is a tuple of classes that are considered when looking for base classes during method resolution.

class.mro()
This method can be overridden by a metaclass to customize the method resolution order for its instances. It is called at class instantiation, and its result is stored in __mro__.


Self

class Test:
    def f1():
        print("function 1")
       
    def f2(self):
        print("self     = %s" %(self))
        print("id(self) = %s" %(id(self)))
        print("function 2")
>>> print(Test.f1())
function 1
None
>>> print(Test.f2())
f2() missing 1 required positional argument: 'self'
>>> print(Test.f2(self))
name 'self' is not defined
>>> t1 = Test()
>>> t2 = Test()
>>> id(Test)
140475643475904 # 이 값은 실행할 때마다 달라진다.
>>> id(t1)
140475709893120
>>> id(t2)
140475709892256
>>> t1.f2()
self     = <__main__.Test object at 0x7fc30cc9aa00> # 0x7fc30cc9aa00 = 140475709893120
id(self) = 140475709893120
function 2
>>> t2.f2()
self     = <__main__.Test object at 0x7fc30cc9a6a0> # 0x7fc30cc9a6a0 = 140475709892256
id(self) = 140475709892256
function 2

위의 예에서 id(t1)의 결과와 t1.f2()의 실행으로 출력된 id(self) = 140475709893120의 값이 동일한 것을 알 수 있다. 즉 self는 클래스의 인스턴스를 의미한다.

self 변수

class Person:
    def __init__(self, name):
        self.name = name
       
    def say_hi(self):
        print("Hi, %s" %self.name)
>>> p1 = Person("june")
>>> p1.name
'june'
>>> Person("june").name
'june'
>>> p1.say_hi()
Hi, june
>>> 
>>> 

참고자료 1 참고자료 2


Instance(인스턴스)

인스턴스는 클래스로 만든 객체를 의미한다. 예컨대 아래 예에서 t는 클래스 Test의 Instance다. 동시에 t는 객체이다. 즉, 인스턴스는 객체와 클래스의 관계를 설명할 때 사용하는 것이다. 따라서 인스턴스는 객체를 실체화한 것이라고 할 수 있다.

class Test:
    pass

t = Test()

참고자료 1 참조자료 2


참고자료

참고자료 1. 제대로 파이썬

0개의 댓글