본문 바로가기
목차
Python

Python Class Definition and Object Model

by ds31x 2025. 12. 24.
728x90
반응형

1. Object-Oriented Programming (OOP)에서의 Class 개념

1.1 Class의 역할

Class = State + Behavior

 

Class는 Object-Oriented Programming에서 StateBehavior를 함께 정의하는 추상화 단위임

  • State는 Object가 보유하는 데이터의 집합임
  • Behavior는 Object가 수행하는 동작의 집합임
  • Class는 동일한 구조와 동작을 공유하는 Instance를 생성하기 위한 설계도 역할임

1.2 Instance의 의미

Instance는 Class로부터 생성된 개별 Object임

  • 각 Instance는 독립적인 State를 가짐
  • 같은 Class의 Instance들은 Behavior를 Class 정의에 따라 공유

Instance는
runtime에 생성되는 실체 Object로서
memory를 차지한다.

 

 

OOP에 대한 보다 자세한 건 다음을 참고: https://dsaint31.me/mkdocs_site/python/oop/oop_0_00_OOP/


2. Python에서의 독특한 특성: Class도 object

2.1 Class도 Instance.

Python에서 Class definition은 정적 선언 코드가 아님

  • Python에서는 Class definition도 runtime에 실행되는 statement
  • Python에서는 Class definition 실행 결과로 type이라는 메타클래스의 instance 인 object를 생성하고 name에 바인딩시킴.
class Person:
    pass

 

위 코드에서 Person은 runtime에 생성된 Class object(=type 클래스의 instance)를 가리키는 name이라고 볼 수 있음.

Python의 할당문(assignment)에서
variable이 단순히 object를 가리키는 name임을 기억할 것.


2.2 참고: Instance, Class, metaclass의 관계 (Python Object Model)

앞 절에서 살펴본 것처럼 Python에서는 Class 역시 object.

 

즉, Python에서 객체 구조는

  • Instance와 Class를 분리된 개념으로 다루지 않고,
  • 단일한 Object Model 위에서 계층적으로 구성됨

이 Python Object Model의 계층 구조는 다음과 같음.

Instance  ->  Class  ->  metaclass(type)

이 구조의 의미는 다음과 같음.

  • Instance는 Class의 Instance임
  • Class는 metaclass type의 Instance임

때문에

Python에서 모든 Custom class(=user defined class)는 type의 instance임.

Python에선
“Class와 Instance가 서로 다른 세계에 존재한다”는 관점이 아니라,
모두 동일한 Object Model 위에 존재한다는 관점을 의미함.

이는 type를 통해 각각의 형을 확인해보는 것으로도 확인 가능함.


2.3 참고: type(obj)의 의미 구분

type(obj)obj어떤 object(또는 metaclass)의 instance인지 확인하는 연산임.

 

Python Object Model에 따라 다음과 같이 동작함:

  • Instance에 대해 호출 시 => 해당 Instance의 Class 반환
  • Class에 대해 호출 시 => 해당 Class의 metaclass 반환
x = 10
type(x)      # int

class A:
    pass

type(A)      # type

 

여기서 type은 단순한 function이 아님에 유의할 것:

  • type은 Class임
  • 동시에 metaclass 역할을 수행함
  • 즉, callable object이지, function으로 간주하면 안 됨

type
“Class를 생성하는 Class (=metaclass)”역할을
하는 object


3. Python의 다른 특징: Dynamic Typing + Run Time Object Model

3.1 Dynamic Typing과 Static Field의 부재

Python은 Dynamic Typing 언어임

  • Variable에 type이 존재하지 않음: 단순한 Name에 불과.
  • 이 Name은 runtime에 Object에 binding됨
  • Object만이 Class를 통해 type을 가짐: strong typing 으로 object의 type은 생성 이후 변경불가.

 

이 특성으로 인해 Python에는 C++/Java 등에 존재하는 다음 개념을 언어 차원에서 제공하지 않음:

  • Static Field

Static Field는 C++/Java에서 Class definition 시 compile-time에 고정되는 class-level storage를 의미

  • C++/Java 에서 Class-level Field들(instance-level field 아님에 주의)은 모두 static field임.
  • C++/Java 에서 Class-level Field들은 compile-time에 구조와 저장위치가 고정됨.

Python에는 Static Field 선언 문법이 존재하지 않음
Python에서도 Class 와 관련된 Field를 위해 Class Data Attribute는 존재하나 이는 static field가 아님.
(Python에서 Class Data Attribute는 Class object에 runtime에 추가되는 attribute)


3.2 참고: Runtime Object Model

Python에서 Object의 생성과 구조는 runtime에 결정

  • Object의 attribute 구성은 compile-time에 고정되지 않음
  • Class와 Instance는 동일한 Object Model 위에 존재함

이를 Runtime Object Model이라 지칭함.

Python은 Runtime Object Model을 채택하고 있음.
Object의 type은 생성 이후 변경되지 않으나,
attribute는 동적으로 추가 및 삭제가 가능함.


4. Python에서의 Class Definition 의 실체

4.1 Class Definition 실행 결과

Class definition 실행 시 다음이 생성됨:

  • Class object (class 키워드 뒤에 놓이는 name이 이 object에 바인딩됨)
  • Class attribute namespace (해당 class의 attribute들의 name이 존재하는 namespace)

4.2 예제

다음과 같이 클래스 Person을 정의하는 코드를 예로 들어본다:

class Person:
    species = "Homo sapiens"

    def greet(self):
        print("Hello")

위의 코드 실행 결과로 생성되는 것은 다음과 같음.

  • Person이라는 name에 바인딩된 Class object
  • Person 클래스의 attribute namespace에 존재하는 Class Data Attribute species
  • Person 클래스의 attribute namespace에 존재하는 Function object greet

주의할 점은 위의 코드가 실행되어도

  • Person 클래스의 인스턴스 들이 가지는 각각의 상태를 나타내는
  • Instance Data Attribute는 생성되지 않는다 는 점임(정의조차 안 됨)

즉, 코드가 실행된 시점에서는 Class object만 존재하며,

  • 해당 Class의 Instance는 아직 생성되지 않았고
  • Instance가 가질 고유한 state가 무엇인지도 지정되지 않은 상태

위의 Class definition이 실행되어도 다음은 생성되지 않음.

  • Instance
  • Instance Data Attribute

Python과 달리,
C++/Java 와 같은 static typing language의 경우,
class를 정의하면 해당 class의 instance가 가지게 될
instnace data attribute의 형과 이름이 정해짐.


5. Class 구성 요소 분류

Class는 크게

  • state에 해당하는 Data Attribute와,
  • behavior에 해당하는 Method Attribute(줄여서 method)로 구성됨.

5.1 Data Attribute

Python의 class가 가지는 Data attribute는 크게 다음의 2가지임:

  • Class Data Attribute
    • Class object에 소속된 data임
    • 모든 Instance가 공유함
    • C++/Java의 Static Field와 역할은 유사하나 static field가 아닌 runtime에 할당되는 차이점을 가짐.
  • Instance Data Attribute
    • Instance object에 소속된 data임
    • Instance마다 독립적임 (각 instance의 state를 저장함)
    • Assignment 시점에 생성됨 (Python 언어의 특징!)

5.2 Method (or Method Attribute)

Python의 class가 가지는 method (Class 안에 정의되는 function)은 목적에 따라 다음 세 종류로 나뉨.

  • Instance Method: Instance의 State를 다루기 위한 Method로 자신의 첫번째 인자 self를 통해 호출시점의 instance에 접근 가능.
  • Class Method: Class 자체를 다루기 위한 Method로 자신의 첫번째 인자 cls를 통해 호출시점의 class에 접근 가능.
    • Class Data Attribute 접근 및 제어
    • alternative constructor 제공
    • subclass를 고려한 factory 제공
  • Static Method:
    • Instance State와 Class State 모두와 무관하지만
    • 개념적으로 클래스에 속하는 pure function.
    • 첫 번째 인자로 자동 전달되는 값이 없음
    • utility 성격의 기능 구현에 적합함

2023.08.20 - [Python] - [Python] instance methods, class methods, and static methods

 

[Python] instance methods, class methods, and static methods

method 의 경우,instance method,class method,static method 로 나뉘지만,field(=variable attribute)의 경우엔, instance variable (=instance data attribute)과 class variable(=class data attribute)만 있음.2025.12.24 - [Python] - Python Class Defi

ds31x.tistory.com


5.3 Class Definition 시점에서 생성(or 정의)되지 않는 것: Instance Data Attribute

4절에 살펴본 것처럼
Python의 경우,
class 정의 코드가 실행될 때, 위의 클래스 구성요소 중에서 Instance Data Attribute는 생성이 되지 않음.

Python에선 사실상 정의가 없다고 봐도 된다.
모든 것이 Object라 정의와 생성이 분리되지 않음:
assignment를 통해 정의와 생성 한번에 이루어진다고 볼 수 있음.

 

Python에서 class definition은 Instance의 state를 미리 선언하거나 고정하지 않음.

Python에서는 이 초기화를
관례적으로 init(self, ...)라는 Instance Method에서 수행함.
이는 Python이
Instance 구조를 runtime에 형성하는
Open Object Model을 채택하고 있기 때문임.

 

다음 절에서는
그렇다면 Instance Data Attribute는 언제, 어떻게 생성되는가를 설명한다.

 

미리 애기하면

  • Python에서는 Instance Data Attribute를
  • __init__(self, ...) 이라는 instance가 생성될 때 호출되는 Instance Method 에서
  • 초기화(=assignment를 통한 생성)하는 코드를 구현하여
  • instance가 생성될 때 자동으로 해당 instance에 속한 instance data attribute를 생성하는 방식을 권한다.

6. __init__()과 Instance Data Attribute 초기화

앞 절에서 확인한 것처럼
Python에서 class definition이 실행되는 시점에는
Instance Data Attribute는 존재하지 않음.

 

Instance의 state는 instance가 생성된 이후 runtime에 초기화를 통해 형성 가능함.

 

때문에, Python에서는

이 초기화를 관례적으로 __init__(self, ...)라는 Instance Method에서 수행함.


6.1 Instance 생성 시점과 __init__()의 역할

Python에서 instance는
Class object를 호출함으로써 생성됨.

p = Person("Alice")

위 코드는 다음 두 단계를 포함함.

  1. 새로운 Instance object 생성
  2. 생성된 Instance를 인자로 하여 __init__(self, ...)라는 instance method가 호출

사실 __init__()은 생성자라고 불리지만,

  • 엄밀히 애기하면
  • instance를 생성하는 method (=생성자)가 아니라
  • 생성자에 의해 instance가 생성된 이후,
  • 해당 instance를 첫번째 argument로 넘겨받아
  • 해당 instance를 초기화하는 instance method임.

6.2 __init__()에서 Instance Data Attribute가 생성되는 방식

__init__() 내부에서 다음과 같은 코드가 작성될 수 있음.

class Person:
    def __init__(self, name):
        self.name = name

여기서 중요한 점은 다음과 같음.

  • self는 생성된 instance를 가리킴
  • self.name = name은 assignment statement임
  • 이 assignment 시점에 name이라는 Instance Data Attribute가 생성됨 (Python에서 할당에 의해 object가 생성됨을 기억할 것)

즉, 다음이 핵심임!

Instance Data Attribute는
__init__()에 “정의”되는 것이 아니라,
__init__() 내부에서 assignment가 실행될 때 생성됨


6.3 __init__()은 필수인가?

Python에서 __init__()필수 요소는 아님.

class A:
    pass

a = A()

위 코드도 정상적으로 동작함.

이 경우:

  • Instance는 생성됨
  • 단, Instance Data Attribute는 하나도 존재하지 않음

즉, 다음을 명심할 것.

__init__()
Instance Data Attribute 생성을 강제하지 않으며,
단지 관례적으로 초기화를 수행하는 위치일 뿐임.


6.4 __init__() 외부에서의 Instance Data Attribute 생성

다시 한번 강조하지만,
Instance Data Attribute는
__init__() 내부에서만 생성될 수 있는 것이 아님.

 

다음의 코드가 가능함:

p = Person("Alice")
p.age = 30
  • age라는 Instance Data Attribute는
    __init__()와 무관하게 runtime에 추가됨

이는 Python Object Model이
Instance 구조를 닫힌 구조(closed structure)로 취급하지 않기 때문임.

즉, Python의 Instance는
생성 이후에도 구조가 확장 가능한 열린 객체(open structure)임.


6.5 왜 __init__()에서 초기화를 권장하는 이유

Python은 Instance 구조를
runtime에 자유롭게 확장할 수 있도록 허용함에도 불구하고,
대부분의 Instance Data Attribute를
__init__()에서 초기화하도록 권장함.

 

이는 다음의 장점을 가지기 때문임:

  • Instance가 가지는 state를 한눈에 파악 가능
  • Object 사용 계약(contract)의 명확화
  • AttributeError 발생 가능성 감소
  • IDE 자동 완성 및 type hint 활용 용이

Python은 Instance 구조를 열어두지만,
가독성과 안정성을 위해 초기화는 init()에서 수행하는 것을 권장함.

 

이제 다음 절에서는

  • Python이 이러한 구조적 유연성을 가지게 된 근본적인 객체 모델인 Open Object Model과,
  • 그 위에서 성립하는 Duck Typing 이라는 Python의 객체 사용방식을 살펴보겠다.

7. 참고: Open Object Model과 Duck Typing

앞 절에서 살펴본
Instance Data Attribute의 동적 추가 가능성은
Python이 채택하고 있는 Open Object Model에서 비롯됨.

 

참고로 이 Open Object Model 위에서
Python의 대표적인 객체 사용 방식인 Duck Typing이 성립함.


7.1 Open Object Model

Python Object는 Open Object Model 특성을 가짐.

  • Object의 구조는 runtime에 결정됨
  • Object 생성 이후에도 attribute 추가 및 삭제 가능
  • Instance는 닫힌 구조(closed structure)가 아님.

앞서 나온 Runtime Object Model과 자주 같이 사용되지만 차이점이 있는 다른 개념임.

  Runtime Object Model Open Object Model
핵심 질문 언제 결정되는가 얼마나 열려 있는가
관점 시간적 관점 구조적 관점
attribute 결정 runtime runtime 이후에도 변경 가능
구조 변경 runtime에 형성 runtime 이후에도 확장 가능
대표 언어 특성 Dynamic Typing Duck Typing, dynamic attribute

7.2 Duck Typing

참고로, Python은
Duck Typing 기반 Object Model을 채택함.

 

Duck Typing에서는

  • Object의 Class 자체보다,
  • Object가 실제로 제공하는 attribute와 behavior가 더 중요함.

즉, 다음이 성립함:

  • 동일한 attribute와 behavior를 제공하는 경우,
  • 서로 다른 Class의 Instance라도
  • 동일한 방식으로 사용 가능함.

오리처럼 걷고, 오리처럼 울면
Python에서는 오리로 취급함.

이러한 방식은
C++/Java에서 interface나 상속을 통해
다형성을 구현하는 방식과 차이를 가짐.

 

C++/Java에서는
특정 interface를 구현하거나
특정 Class를 상속받는 것이 다형성의 전제가 되지만,

 

Python에서는
약속된 attribute와 behavior를 제공하는 것만으로도
다형성이 성립함.

 

참고로,

Python의 Duck Typing은 상속 없이도 다형성을 구현할 수 있게 해주지만,
Python에서 inheritance가 사용되지 않는다는 의미는 아님.

Python에서도 기존 Class의 재사용성과 확장을 위해 inheritance가 널리 사용됨.

inheritance를 통해 부모 Class의 attribute와 behavior를 자식 Class가 가지게 되며, 이 역시 다형성을 구현하는 중요한 수단임.

 

Python의 Duck Typing은
inheritance를 대체하는 개념이 아니라,
inheritance에 의존하지 않아도 다형성을 표현할 수 있게 하는 개념 으로
Python의 Open Object Model의 대표적인 사용방식임.

 

다형성이란: https://dsaint31.me/mkdocs_site/python/oop/oop_1_07_polymorphis


8. Object Internal Structure: __dict__

지금까지 살펴본 것처럼,
Python의 Instance는 Open Object Model을 기반으로 하여
runtime에 attribute를 자유롭게 추가 및 삭제할 수 있음.

 

그렇다면 다음과 같은 질문이 자연스럽게 이어짐.

Instance Data Attribute는
구체적으로 어디에 저장되며,
어떻게 이러한 동적 구조를 유지할 수 있는가?

 

이 질문에 대한 답이 바로
Python Object 내부에서 attribute를 저장하는 공간
__dict__임.


8.1 __dict__의 의미

__dict__
Object가 자신이 소유한 attribute를 저장하는 dictionary 기반 저장 공간임.

  • Class object는 Class-level attribute를 __dict__에 저장함
  • Instance object는 Instance-level attribute를 __dict__에 저장함

즉, 다음이 성립:

Python에서 attribute란
Object의 __dict__에 저장된 name 과 object의 mapping임.


8.2 확인 코드: __dict__로 Class와 Instance 구조 확인하기

앞 절에서 설명한 내용을
실제 코드와 출력 결과를 통해 확인해 본다.

8.2.1 Class 정의

class A:
    kind = "demo"

    def __init__(self):
        self.x = 10

이 Class definition에서 정의된 요소는 다음과 같음.

  • A : Class object
  • kind : Class Data Attribute
  • __init__ : Method Attribute
  • self.x = 10 : Instance Data Attribute를 생성하는 assignment

8.2.2 Instance 생성

a = A()

이 문장이 실행되면 다음이 순서대로 발생함.

  • 새로운 Instance object a 생성
  • __init__(self) 호출
  • self.x = 10 실행 → Instance Data Attribute x 생성

8.2.3 __dict__ 확인

print("Class keys:", list(A.__dict__.keys())[:8])
print("Instance dict:", a.__dict__)
print("Class data attribute:", A.kind)
print("Instance data attribute:", a.x)

출력 결과를 통해 다음을 확인 가능함.

  • kind__init__은 Class object A__dict__에 존재함
  • a.__dict__에는 Instance object a가 가지는
    Instance Data Attribute x만 저장되어 있음

Class-level attribute와
Instance-level attribute는
서로 다른 __dict__에 분리되어 저장됨.

8.2.4 Attribute lookup 규칙 확인

주의할 점은 다음 코드가 정상적으로 동작한다는 점임.

a.kind

이는 Instance에서 attribute를 찾을 때
다음과 같은 attribute lookup rule이 적용되기 때문임.

  1. 먼저 a.__dict__ 확인
  2. 없으면 A.__dict__ 확인

따라서 kind가 Instance에 존재하지 않더라도
Class에 존재하면 접근 가능함.


9. Attribute Lookup Rule

아래 설명은 조금 간략화한 것으로 내부 동작의 일부를 생략하고 설명함(Class와 instance의 관점에 초점을 둔 터라...)

 

좀 더 정확한 attribute lookup rule은 다음을 참고 (Special method등의 차이점까지 설명한 버전임)

https://ds31x.tistory.com/622#%EC%B0%B8%EA%B3%A0-attribute-lookup%EC%9D%98-%EC%9D%B4%ED%95%B4

 

Python Data Model (+ Metaclass)

1. 들어가며: Python은 어떻게 동작하는가?Python 코드를 작성할 때, 우리는 자연스럽게 다음과 같은 표현들을 사용한다:a + b # 두 값을 더한다len(my_list) # 리스트의 길이를 구한다my_list[0] # 첫 번째 요

ds31x.tistory.com

 

앞 절에서 확인한 것처럼
Python에서 attribute는 Object의 __dict__에 저장됨.

 

그러나 attribute 접근 시
항상 동일한 위치에서 바로 검색되는 것은 아님.

 

Python은 attribute에 접근할 때
정해진 검색 순서(rule)를 따름.

이를 Attribute Lookup Rule이라 지칭함.


9.1 Instance Attribute Lookup 순서

Instance obj에 대해
obj.attr 형태로 attribute에 접근할 경우,
Python은 다음 순서로 attribute를 검색함.

  1. obj.__dict__ 확인
  2. obj의 Class의 __dict__ 확인 **
  3. Class의 부모 Class(Base class)의 __dict__ 확인
  4. 해당 attribute가 끝까지 발견되지 않으면 AttributeError 발생

즉, 다음이 성립!

Instance-level attribute가
Class-level attribute보다
항상 우선하여 검색됨


9.2 예제: Instance와 Class Attribute 충돌

class A:
    x = 10

a = A()
print(a.x)   # 10

a.x = 20
print(a.x)   # 20
print(A.x)   # 10

이 코드의 동작 의미는 다음과 같음.

  • a.x 접근 시 먼저 a.__dict__ 확인
  • a.__dict__x가 존재하면 Class의 x는 무시됨
  • Class Data Attribute는 변경되지 않음

이는 function에서 local variable 과 global variable에서 나타나는 shadowing 이 instance attribute와 class attribute에서도 존재함을 의미함.

Instance Data Attribute는
Class Data Attribute를 shadowing함.

 


9.3 Method Lookup도 동일한 규칙 적용

Method 역시
Class의 __dict__에 저장된 Function object임

참고로, Python에서 method도 합쳐서 attributes라고 칭하는게 일반적임.

class A:
    def f(self):
        print("class method")

a = A()
a.f()

여기서도 lookup 과정은 동일함.

  • a.__dict__ -> 없음
  • A.__dict__ -> f 발견
  • Function object를 Method로 binding 후 호출

9.4 Lookup Rule과 Open Object Model의 관계

Attribute Lookup Rule
Python의 Open Object Model을 전제로 동작함.

  • Instance에 attribute를 추가하면 즉시 lookup 대상에 포함됨
  • Class에 attribute를 추가해도 기존 Instance에서 접근 가능
  • 구조 변경이 runtime에 반영됨

즉, 다음이 성립함.

Python의 Attribute Lookup Rule은
runtime에 형성된 객체 구조를 그대로 반영함.

Python에서 attribute 접근은
Instance -> Class -> Base Class 순서로 검색되며,
이는 Open Object Model을 기반으로 한 동적 lookup 규칙임.


9.5 Attribute Lookup Rule과 MRO

Attribute Lookup Rule은
Instance와 Class를 모두 포함하는
일반적인 attribute 검색 규칙임.

 

이 Attribute Lookup Rule 중에서
Class 간 상속 관계에 따른 attribute 검색 순서만을 분리하여 정의한 규칙
Method Resolution Order(MRO)라고 지칭함.

 

즉,
Method Resolution Order(MRO)
상속 구조를 가진 Class들 사이에서
attribute를 어떤 순서로 검색할지를 정의한 규칙임.


10. Attribute Constraint Mechanism: __slots__

앞 절에서 살펴본 __dict__ 기반 구조는
매우 유연하지만, 다음과 같은 특징을 가짐.

  • 모든 Instance가 개별 __dict__를 가짐
  • attribute 추가가 무제한으로 허용됨
  • Instance 수가 많을 경우 memory 사용량 증가 가능

이러한 열린 구조(Open Object Model)
의도적으로 제약을 가하고 싶을 때 사용하는 메커니즘이
__slots__임.


10.1 __slots__의 역할

__slots__는 Class definition 시
Instance가 가질 수 있는 attribute의 이름을 미리 제한하는 메커니즘임.

 

주요 목적은 다음과 같음.

  • 허용 attribute 제한
  • 불필요한 attribute 추가 방지
  • Instance별 __dict__ 생성 방지
  • Memory usage 최적화

10.2 예제와 제약 확인

class Point:
    __slots__ = ("x", "y")

    def __init__(self, x, y):
        self.x = x
        self.y = y
p = Point(1, 2)
print(hasattr(p, "__dict__"))  # False 기대

p.z = 3  # AttributeError 기대

 

이 코드에서 확인할 수 있는 점은 다음과 같음.

  • __slots__가 정의된 Instance는 __dict__를 가지지 않음
  • 허용되지 않은 attribute(z)를 추가하려 하면 AttributeError 발생
  • Instance 구조가 닫힌 구조에 가까워짐

__slots__
Python의 Open Object Model을 완전히 제거하는 것이 아니라,
필요한 경우 선택적으로 제약을 가하는 장치임.

 

즉, Python의 Open Object Model에서

  • __dict__는 attribute 저장 방식이고
  • __slots__은 attribute 제약 메커니즘임.

11. Python에서 Custom Class를 만드는 전형적인 코드

2024.04.14 - [Python] - [Python] class 만들기.

 

[Python] class 만들기.

Python에서의 custom class 만들 때 미리 알고있어야 하는 내용.Python에선 모든 것이 객체임: 아래의 class를 정의하면 CustomClass 라는 이름의 type 형의 객체가 생성됨:class 키워드로 시작하는 클래스 정의

ds31x.tistory.com


12. 요약

다음의 문장이 이해가 안되면 다시 이 문서를 읽어볼 것.

  • Python에서 Class는 Object임
  • Instance는 Class의 Instance임
  • Class는 metaclass type의 Instance임
  • Python은 Dynamic Typing 언어임
  • Variable은 type을 가지지 않는 name임
  • Object만이 Class를 통해 type을 가짐
  • Python Object Model은 Runtime Object Model임
  • Object의 attribute 구조는 runtime에 결정됨
  • Python에는 Static Field가 언어 차원에서 존재하지 않음
  • Class Data Attribute는 runtime에 생성되는 attribute임
  • Class definition은 runtime에 실행되는 statement임
  • Class definition 시 Instance와 Instance Data Attribute는 생성되지 않음
  • Instance는 Class 호출 시 runtime에 생성됨
  • __init__()은 생성된 Instance를 초기화하는 method임
  • Instance Data Attribute는 assignment 시점에 생성됨
  • Python은 Open Object Model을 채택함
  • Instance 구조는 runtime에 확장 가능함
  • Python은 Duck Typing 기반 객체 사용 방식을 채택함
  • Duck Typing은 inheritance 없이도 다형성을 표현 가능하게 함
  • attribute는 Object의 __dict__에 저장됨
  • attribute 접근은 Instance -> Class -> Base Class 순서로 수행됨
  • 상속 구조에서의 검색 순서는 MRO로 정의됨
  • __slots__는 Instance attribute 구조를 제한하는 메커니즘임

같이 보면 좋은 자료들

2024.07.24 - [Python] - [Python] Class 간단 정리

 

[Python] Class 간단 정리

OOP 개념https://dsaint31.me/mkdocs_site/python/oop/oop_0_00_OOP/ BMEObject Oriented Programming (OOP) OOP란? OOP는 Object 에 기반 하여, Object 를 이용 하고 Object 를 만들고(정의 및 구현), Object 를 조합 하여 프로그래밍 하

ds31x.tistory.com

2026.02.25 - [Python] - Python Data Model (+ Metaclass) 위의 내용과 이 문서의 글을 모두 이해하면 Python에서 동작을 상당부분 이해하게 됨. 꼭 읽어보길 권함(조금 고급 내용이라 간단히 코딩만 하는 경우라면 전부 이해할 필요는 없음)

 

Python Data Model (+ Metaclass)

1. 들어가며: Python은 어떻게 동작하는가?Python 코드를 작성할 때, 우리는 자연스럽게 다음과 같은 표현들을 사용한다:a + b # 두 값을 더한다len(my_list) # 리스트의 길이를 구한다my_list[0] # 첫 번째 요

ds31x.tistory.com

 

https://dsaint31.me/mkdocs_site/python/oop/oop_3_01_python_class/

 

BME

Python에서의 Class Class 도 Python에서는 instance임. 다음이 Python에서 Class와 Object의 실체를 말해준다. 모든 Object는 object를 super-class로 가진다. 모든 Class는 type이라는 Class의 instance이다. 우리가 Samp1 이

dsaint31.me

https://dojang.io/mod/page/view.php?id=2468

 

파이썬 코딩 도장: 47.9 메타클래스 사용하기

메타클래스(metaclass)는 클래스를 만드는 클래스인데, 이 메타클래스를 구현하는 방법은 두 가지가 있습니다. type을 사용하여 동적으로 클래스를 생성하는 방식 type을 상속받아서 메타클래스를

dojang.io

 

열혈파이썬에서 해당 내용의 동영상 강좌:

https://player.vimeo.com/video/378703521

https://player.vimeo.com/video/378703708

https://player.vimeo.com/video/378703881

https://player.vimeo.com/video/378704294

 

728x90