Python
Python class, instance 변수
Prower
2022. 7. 19. 00:27
728x90
반응형
instance 변수
- 각 instance 마다 갖고 있는 독립된 변수
- 클래스로 부터 몇 개의 인스턴스를 만들어도 각 인스턴스의 값은 독립적이다.
- python에서 self 예약어를 사용하여 접근
- 클래스 인스턴스가 생성되는 순간 메모리에 적재되며, 인스턴스가 생성되기 이전에 접근 불가
class Foo:
def __init__(self):
self.a = 1
접근 범위
- 인스턴스의 메서드, 클래스의 생성자, 소멸자 등에서 접근 가능
class Foo:
def __init__(self):
self.foo = "foo"
def __del__(self):
del self.foo
def print(self):
print(self.foo)
> "foo"
class 변수
- class 자체에서 갖고 있으며, 모든 인스턴스 사이에서 공유되는 변수
- 클래스 자체를 통해 접근하거나, cls 예약어를 통해 접근
- 클래스가 로드되는 순간 메모리에 적재됨
class Foo:
foo = "foo"
@classmethod
def print(cls):
print(cls.foo)
Foo.print()
print(Foo.foo)
>
foo
foo
접근 범위
- 사실상 접근범위에 제한은 없지만 self 예약어를 사용하여 접근하면, 클래스 변수를 인스턴스 변수로 은폐시킬 수 있으므로 주의해야함
class Foo:
foo = "foo"
def print(self):
self.foo = "bar"
print(self.foo)
print(Foo.foo)
foo = Foo()
foo.print()
>
bar
foo
- 위 예시에서 self 에약어를 통해 foo 변수에 접근하는 경우 인스턴스 내에서 찾지 못해 class 범위 까지 올라가 해당 값을 self.foo 에 할당시킨다.
- 결과를 보면 클래스 변수를 오염시키지는 않으며, 각각 독립적인 변수가 생성된 것으로 보일 수 있지만, 각 변수를 은폐시킬 수 있는 위험이 있다.
상속의 경우
- 상속을 받은 각 클래스에서 동일한 이름으로 클래스 변수를 선언한 경우에 대한 범위를 알아본다.
class Foo:
common = {
"foo": 1
}
def print(self):
print(self.common)
class Bar(Foo):
common = {
"bar": 2
}
def print(self):
print(self.common)
foo = Foo()
bar = Bar()
print(Foo.common)
print(Bar.common)
foo.print()
bar.print()
>
{'foo': 1}
{'bar': 2}
{'foo': 1}
{'bar': 2}
- Foo, Bar 클래스에 각각 common이라는 이름의 클래스 변수 선언하고 각각 다른 값을 할당
- 출력 결과를 보면 self 예약어를 통해 접근한 경우 각 scope에서 침해되지 않는 것으로 확인된다
728x90
반응형