The Boxer

Python class, instance 변수 본문

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
반응형

'Python' 카테고리의 다른 글

python mutable, immutable  (0) 2022.07.23
python object interning  (0) 2022.07.22
python dataclass  (0) 2022.07.21
pydantic  (0) 2022.07.07
Fixture, Mock, Spy  (0) 2022.07.01
Comments