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 citizen
= First Class type
= First Class entity
= First Class value
아래와 같은 특징을 가지고 있는 객체를 의미한다.
즉 파이썬에서는 자료형(int, str, list, tuple, set, dictionary...), 변수, 함수, 클래스 등이 일급 객체다. 반면 C에서 함수의 이름은 함수의 매개변수로 전달할 수 없다. C에서 함수의 매개변수로 전달하는 것은 Pointer다.
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.
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.)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
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) # 인스턴스.속성 형식으로 값을 가져옴
Method Resolution Order의 약자로 메소드의 상속 순서를 반환한다.
Built-in Types
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__.
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는 클래스의 인스턴스를 의미한다.
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 >>> >>>
인스턴스는 클래스로 만든 객체를 의미한다. 예컨대 아래 예에서 t는 클래스 Test의 Instance다. 동시에 t는 객체이다. 즉, 인스턴스는 객체와 클래스의 관계를 설명할 때 사용하는 것이다. 따라서 인스턴스는 객체를 실체화한 것이라고 할 수 있다.
class Test: pass t = Test()