먼저 예시 코드를 보여주겠다.
각 코드를 실행했을 때 어떤 출력이 나오는지 맞춰보자.
참고로, 출력은 Lee
, Kim
혹은 Park
중에서만 나온다.
class MyClass:
name = "Lee"
def __init__(self, name):
self.name = name
c = MyClass("Kim")
print(c.name)
class MyClass:
name = "Lee"
def __init__(self, name):
self.name = name
print(MyClass.name)
class MyClass:
name = "Lee"
c = MyClass()
print(c.name)
class MyClass:
name = "Lee"
def set_name(self, name):
self.name = name
c = MyClass()
c.set_name("Kim")
print(c.name)
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)
Kim
Lee
Lee
Kim
Lee Park
정답 맞추기엔 매우 쉬운 문제일 수도 있다.
허나 중요한 점은 name
과 self
가 각각 무엇을 의미하는가이다.
name
은 Class 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 attribute
에 self
로 접근했다.
self
는 instance
를 나타내는데, 해당 instance
는 클래스 속성을 당연히 갖고 있기 때문에 self
로 Class attribute
에 접근할 수 있지만,
Class attribute
에 접근한다고 명시하기 위해서는 MyClass.name
같이 클래스 이름으로 직접 접근하는 것이 더 좋다.