파이썬 클래스 질문 드립니다.
조회수 647회
파이썬 클래스부분은 아무리 봐도 햇갈리네요 ㅜㅜ
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'로 변경하려면 어떻게 해야하는지 궁금합니다.
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'
댓글 입력