Python to AI

Python - 객체 탐색과 속성 관리

최 수빈 2024. 12. 15. 19:23

 

id() 함수

 

 

Python에서 id() : 객체의 고유한 식별자(Unique Identifier)를 반환

 

=> CPython 구현에서 객체의 메모리 주소를 나타냄

 

고유성

Python 실행 중, 각 객체는 고유한 id 값을 가짐(= 같은 객체에 대해 항상 고유한 값을 반환, 새로운 객체가 생성되면 새로운 id가 할당)

 

메모리 주소와 관련

CPython에서는 id()가 객체의 메모리 주소를 반환 (다른 Python 구현에서는 이 동작이 다를 수 있음)

 

객체 비교

is 연산자와 함께 사용하여 두 객체가 동일한 객체인지(동일한 메모리 위치를 가리키는지) 확인할 수 있음

a is b 는 id(a) == id(b)와 동일

 

a = [1, 2, 3]
b = a
print(id(a))  # 140660040349888 (예: 메모리 주소)
print(id(b))  # 140660040349888
print(a is b)  # True
a = 10
b = 10
print(id(a), id(b))  # 같은 값 출력 (int는 불변 객체로 재사용됨)
print(a is b)  # True
a = [1, 2, 3]
b = [1, 2, 3]

print(id(a) == id(b))  # False
print(a is b)          # False
# 불변 객체
x = 10
y = 10
print(id(x) == id(y))  # True (같은 메모리 주소를 공유)

# 가변 객체
x = [1, 2]
y = [1, 2]
print(id(x) == id(y))  # False (서로 다른 객체)

 

 

객체 생성과 확인

 

인스턴스화 후 객체 생성

클래스를 사용해 객체를 생성

생성된 객체는 특정 메타 정보를 가짐

  • 인스턴스화: 클래스를 기반으로 객체를 생성하는 과정. (생성된 객체를 인스턴스라고 함)

객체의 메타정보 확인

dir() 함수

객체가 가지고 있는 메서드와 속성의 리스트를 반환

print(dir(a))
# ['__add__', '__class__', ..., '__sizeof__', '__str__', '__subclasshook__']

 

__dict__ 속성

객체의 인스턴스 속성을 딕셔너리 형태로 반환

print(a.__dict__)
# {'name': 'John', 'age': 20, 'grade': 'A'}

 

 

리스트와 객체의 특성

  • list는 클래스.  리스트를 생성할 때도 list() 생성자를 호출한다.
l = []  # 리스트 생성
l = list()  # 위와 동일함

 

 

 

Docstring의 중요성

Docstring은 함수, 클래스, 모듈 등에 대한 설명을 작성하는 데 사용

주석(comment)과 다르게, 런타임 중 .__doc__으로 접근 가능

class Student:
    """
    학생 정보를 담고 있는 클래스
    """
    pass

print(Student.__doc__)
# 출력: 학생 정보를 담고 있는 클래스

 

 

 

 

전체 응용

class Student:
    """
    학생 정보를 저장하고, 장학 점수를 관리하는 클래스
    """
    # 클래스 변수
    scholarship_score = 80

    def __init__(self, name, age, grade):
        """
        인스턴스 초기화
        :param name: 학생 이름
        :param age: 학생 나이
        :param grade: 학생 등급
        """
        self.name = name
        self.age = age
        self.grade = grade

    def get_grade(self):
        """
        학생의 등급을 반환
        :return: 학생 등급
        """
        print(f"called >>>> get_grade")
        return f"return >>>> {self.grade}"

    def change_scholarship_score(self):
        """
        클래스 변수인 장학 점수를 변경
        """
        Student.scholarship_score = 85
student = Student("SUBIN", 49, "A")

# 인스턴스 메서드 호출
print(student.get_grade())  # 'return >>>> A'

# 클래스 변수 접근 및 변경
print(Student.scholarship_score)  # 80
student.change_scholarship_score()
print(Student.scholarship_score)  # 85

# 메타정보 확인
print(dir(student))  # 속성과 메서드 리스트
print(student.__dict__)  # {'name': 'SUBIN', 'age': 49, 'grade': 'A'}