[Python3] class attribute vs instance attribute

SangHun·2021년 9월 26일
0

문제

먼저 예시 코드를 보여주겠다.
각 코드를 실행했을 때 어떤 출력이 나오는지 맞춰보자.

참고로, 출력은 Lee, Kim 혹은 Park 중에서만 나온다.

1번

class MyClass:
    name = "Lee"
    
    def __init__(self, name):
        self.name = name

c = MyClass("Kim")

print(c.name)

2번

class MyClass:
    name = "Lee"
    
    def __init__(self, name):
        self.name = name

print(MyClass.name)

3번

class MyClass:
    name = "Lee"

c = MyClass()

print(c.name)

4번

class MyClass:
    name = "Lee"
    
    def set_name(self, name):
        self.name = name

c = MyClass()
c.set_name("Kim")

print(c.name)

5번

class MyClass:
    name = "Lee"
    
    def __init__(self, name):
        self.name = name
    
    def set_name(self, name):
        self.name = name

c = MyClass("Kim")
c.set_name("Park")

print(MyClass.name, c.name)

정답

  1. Kim
  2. Lee
  3. Lee
  4. Kim
  5. Lee Park

정답 맞추기엔 매우 쉬운 문제일 수도 있다.

Class vs Instance

허나 중요한 점은 nameself가 각각 무엇을 의미하는가이다.

  • nameClass attribute
  • self는 현재 instance
  • __init__() 메서드 안에서 self.로 만들면 Instance attribute

좀 더 이해하기 쉽게 코드로 써보자면,

class MyClass:
    name = "Lee"
    
    self.__init__(self, name):
        self.name = name
        
    self.set_name(name):
        self.name = name
        
my_class = MyClass("Kim")

# Find "name" in instance attributes first.
# If it's not found, then find "name" in class attributes.
# If it's not found again, raise AttributeError.
my_name = my_class.name

추가

4번 문제에서 Class attributeself로 접근했다.

selfinstance를 나타내는데, 해당 instance는 클래스 속성을 당연히 갖고 있기 때문에 selfClass attribute에 접근할 수 있지만,

Class attribute에 접근한다고 명시하기 위해서는 MyClass.name 같이 클래스 이름으로 직접 접근하는 것이 더 좋다.

profile
개발괴발자

0개의 댓글