파이썬 클래스 질문 드립니다.

조회수 76회

파이썬 클래스부분은 아무리 봐도 햇갈리네요 ㅜㅜ

class test1:
    def __init__(self):
        self.a = 'a'
    def test1_1(self):
        self.b = 'b'
        return self.b

class test2:
    def __init__(self):
        self.c = 'c'
    def test2_1(self):
        self.d = 'd'
        cls.a = 9999
        cls.b = 8888
        return self.d

cls = test1()
print(cls.a)
print(cls.test1_1())
print(test2().c)
print(test2().test2_1())
print(cls.a)
print(cls.test1_1())

요부분에서 self.b 값을 `8888'로 변경하려면 어떻게 해야하는지 궁금합니다.

  • ?? test2 클래스에서 cls를 참조하네요? 그게 test2 클래스 내부에서 어디에 있는데요? 엽토군 2019.5.22 18:08
  • test2내부에 없는데... 아래 `cls = test1()`는 불러와지네요?? 다크매터 2019.5.23 09:00

1 답변

  • OOP의 학습은 파이썬 말고 다른 언어로 진행하는 것을 추천드립니다.

    파이썬의 OOP는 냉정하게 prototype 수준입니다.

    일예로 캡슐화도 되지 않습니다. __두번넣는다고 접근이 안되는 것이 아닙니다. name mangling 하여 이름을 바꾸는 것뿐이라 얼마든지 접근할 수 있습니다.

    질문자가 혼동하는 것은 인스턴스 변수는 self. 로 시작한다는 점을 혼동하는 것 같습니다. 아래예에서 self 는 다른언어의 this 와 같습니다. 보통 c++, 자바나 c# 같은 언어들은 묵시적으로 메소드의 첫 파라미터 this를 자동으로 넣습니다.

    아래의 예에서 변수 b 에 접근하려면 self.b = 'b' 가 실행되어야 인스턴스(cls)에서 접근이 가능합니다.

    In [1]: class test1: 
       ...:     def __init__(self): 
       ...:         self.a = 'a' 
       ...:     def test1_1(self): 
       ...:         self.b = 'b' 
       ...:         return self.b 
       ...:                                                                         
    
    In [2]: cls = test1()                                                           
    
    In [3]: cls.test1_1()    # self.b = 'b' 가 실행되었음                                                           
    Out[3]: 'b'
    
    In [5]: cls.b            # 접근가능                                                                   
    Out[5]: 'b'
    
    In [6]: cls.b = 'bb'    # 변경가능                                                            
    
    In [7]: cls.b                                                                   
    Out[7]: 'bb'
    
    In [8]: cls2 = test1()                                                                                                    
    
    In [9]: cls2.b    # self.b 가 실행되지 않았기 때문에 인스턴스 변수 b는 존재치 않음                                                                                                        
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-9-d2c349d5bcec> in <module>
    ----> 1 cls2.b
    
    AttributeError: 'test1' object has no attribute 'b'
    

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.