クラス変数(class variable)とインスタンス変数(instance variable)


class Factory:
	num = 0 # 클래스 변수
    def increaseClassNum(self):
    	Factory.num += 1 # 클래스를 이용한 변수 접근
    def increaseInstanceNum(self):
    	self.num += 1 # 인스턴스 변수
クラス変数はクラスを宣言するときに直接次のself.~非形状変数、
インスタンス変数はself~形態の変数と考えられる.
クラス変数とインスタンス変数にはいくつかの特徴があります.
1.クラス変数はすべてのインスタンスで共有できます.
2.インスタンスのインスタンス変数がクラス変数と同じ名前で宣言されている場合、インスタンスで変数が呼び出されると、クラス変数ではなくインスタンス変数が呼び出されます.
イニシアチブ
様々な状況をより詳しく知るためのシナリオです.
idが同じであれば、同じを表す.
  • シリーズインスタンスA
  • の作成
  • Aの増分ClassNum()
  • id(A.num) == id(Factory.num)
  • A.num : 1
  • Factory.num : 1
  • ファクトリクラスでnumを直接3に変更
  • id(A.num) == id(Factory.num)
  • A.num : 3
  • Factory.num : 3
  • シリーズインスタンスBの作成
  • id(A.num) == id(B.num)
  • B.num : 3
  • Factory.num : 3
  • BのインクリメンタルClassNum()
  • id(A.num) == id(B.num)
  • A.num : 4
  • B.num : 4
  • Factory.num : 4
  • B増分Instance Num()
  • id(A.num) != id(B.num)
  • id(A.num) == id(Factory.num)
  • id(B.num) != id(Factory.num)
  • A.num : 4
  • B.num : 5
  • Factory.num : 4
  • スキーマのコードと各出力値が記録されます.
    # 1. Factory 인스턴스 A 생성
    A = Factory()
    
    # 2. A 의 increaseClassNum() 수행
    A.increaseClassNum()
    
    print(id(A.num) == id(Factory.num))  # True
    
    print(A.num)  # 1
    print(Factory.num)  # 1
    
    # 3. Factory 클래스를 통해 직접적으로 num 을 3으로 수정
    Factory.num = 3
    
    print(A.num)  # 3
    print(Factory.num)  # 3
    
    # 4. Factory 인스턴스 B 생성
    B = Factory()
    
    print(id(A.num) == id(B.num))  # True
    print(B.num)  # 3
    print(Factory.num)  # 3
    
    # 5. B 의 increaseClassNum() 수행
    B.increaseClassNum()
    
    print(id(A.num) == id(B.num))  # True
    print(A.num)  # 4
    print(B.num)  # 4
    print(Factory.num)  # 4
    
    # 6. B 의 increaseInstanceNum() 수행
    B.increaseInstanceNum()
    
    print(id(A.num) == id(B.num))  # False
    print(id(A.num) == id(Factory.num))  # True
    print(id(B.num) == id(Factory.num))  # False
    print(A.num)  # 4
    print(B.num)  # 5
    print(Factory.num)  # 4