여러가지 속성

  • 인스턴스 속성
  • 클래스 속성
  • 비공개 속성

인스턴스 속성 (instance attribute)

인스턴스 속성은 객체마다 다르게 가지는 속성이다. 다시말해 self.name = name 과 같이 self.변수이름 = 변수이름 부분이 인스턴스 속성이다.

  • 클래스 안에서 인스턴스 속성 사용: self.속성명
  • 클래스 밖에서 인스턴스 속성 사용: 객체명.속성명
class Unit:
    def __init__(self, name, hp, shield, demage):
        self.name = name
        self.hp = hp
        self.shield = shield
        self.demage = demage

probe = Unit("프로브", 20, 20, 5)
zealot = Unit("질럿", 100, 60, 16)
dragoon = Unit("드라군", 100, 80, 20)
>>> probe.name
'프로브'

위의 예제에서 probe는 probe 만의 name, hp, sheild, damage를 가지고 있는 것이고 zealot은 zealot만의 name, hp, sheild, damage를 가지고 있다.

클래스 속성 (class attribute)

클래스 속성은 모든 객체가 공유하는 속성이다. 클래스 속성은 self를 사용하지 않는다.

  • 클래스 안에서 클래스 속성 사용: 객체명.속성명
  • 클래스 밖에서 클래스 속성 사용: 객체명.속성명
class Unit:
    count = 0
    def __init__(self, name, hp, shield, demage):
        self.name = name
        self.hp = hp
        self.shield = shield
        self.demage = demage
        Unit.count += 1

probe = Unit("프로브", 20, 20, 5)
zealot = Unit("질럿", 100, 60, 16)
dragoon = Unit("드라군", 100, 80, 20)

Unit.count

결과
3

위 예제에서 count 값은 클래스 속성이다.

비공개 속성 (private attribute)

비공개 속성은 클래스 안에서만 접근 가능한 속성이다. 클래스 밖에서 특정 속성에 접근하지 못하게 하고 싶을 때 __속성명 으로 사용하면 된다. 비공개 속성은 다른 값으로 변경이 불가능하다.

  • 클래스 안에서 비공개 속성 사용: self.__속성명
  • 클래스 밖에서 비공개 속성 사용: 불가능 (name mangling 으로 가능)
class Unit:
    def __init__(self, name, hp, shield, demage):
        self.name = name
        self.__hp = hp
        self.shield = shield
        self.demage = demage

    def __str__(self):
        return f'[{self.name}] 체력: {self.__hp}, 방어막: {self.shield}, 공격력: {self.demage}'

probe = Unit("프로브", 20, 20, 5)
zealot = Unit("질럿", 100, 60, 16)
dragoon = Unit("드라군", 100, 80, 20)

zealot.__hp

결과
AttributeError: 'Unit' object has no attribute '__hp'

사실 비공개 속성은 접근 자체가 아예 불가능한 것은 아니고 name mangling 이라는 이름을 바꾸는 기술을 사용해 접근이 어렵게 만들어놓은 것이다.

>>> print(probe)
[프로브] 체력: 20, 방어막: 20, 공격력: 5
>>> probe.__hp = 9999
>>> print(probe)
[프로브] 체력: 20, 방어막: 20, 공격력: 5
>>> print(zealot)
[질럿] 체력: 100, 방어막: 60, 공격력: 16
>>> zealot._Unit__hp = 9999
>>> print(zealot)
[질럿] 체력: 9999, 방어막: 60, 공격력: 16