이 튜토리얼에서는 비공개 변수 Python 클래스에서 .
Python에는 개인 변수라는 개념이 없습니다. . 그러나 대부분의 Python 개발자는 명명 규칙을 따라 변수가 공개되지 않고 비공개임을 알려줍니다.
이중 밑줄로 변수 이름을 시작해야 합니다. 개인 변수로 나타내기 위해(실제로는 아님). 예:- 하나, 둘 등 ..,.
이미 말했듯이 이름이 이중 밑줄로 시작하는 변수는 private가 아닙니다. 여전히 액세스할 수 있습니다. private 타입 변수를 생성하는 방법과 접근 방법을 알아보겠습니다.
# creating a class class Sample: def __init__(self, nv, pv): # normal variable self.nv = nv # private variable(not really) self.__pv = pv # creating an instance of the class Sample sample = Sample('Normal variable', 'Private variable')
클래스와 해당 인스턴스를 만들었습니다. 하나는 normal이고 다른 하나는 __init__ 메소드 내부에 있는 두 개의 변수가 있습니다. 이제 변수에 액세스하려고 합니다. 그리고 무슨 일이 일어나는지 보십시오.
예
# creating a class class Sample: def __init__(self, nv, pv): # normal variable self.nv = nv # private variable(not really) self.__pv = pv # creating an instance of the class Sample sample = Sample('Normal variable', 'Private variable') # accessing *nv* print(sample.nv) # accessing *__pv** print(sample.__pv)
출력
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Normal variable --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-13-bc324b2d20ef> in <module> 14 15 # accessing *__pv** ---> 16 print(sample.__pv) AttributeError: 'Sample' object has no attribute '__pv'
프로그램은 오류 없이 nv 변수를 표시했습니다. 하지만 AttributeError가 발생했습니다. __pv에 액세스하려고 할 때 변수.
이 오류가 발생하는 이유는 무엇입니까? 변수 이름이 __pv인 속성이 없기 때문에 . 그렇다면 self.__pv =pv는 어떻습니까? init 메서드의 문? 이에 대해서는 잠시 후에 논의하겠습니다. 먼저 __pv에 액세스하는 방법을 알아보겠습니다. 변수.
이름이 이중 밑줄로 시작하는 모든 클래스 변수에 액세스할 수 있습니다. _className\_variableName_으로 . 예를 들어 _Sample\_pv_입니다. . 이제 _Sample\_pv_를 사용하여 액세스하세요. 이름.
예
# creating a class class Sample: def __init__(self, nv, pv): # normal variable self.nv = nv # private variable(not really) self.__pv = pv # creating an instance of the class Sample sample = Sample('Normal variable', 'Private variable') # accessing *nv* print(sample.nv) # accessing *__pv** using _Sample__pv name print(sample._Sample__pv)
출력
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Normal variable Private variable
변수 이름이 __pv인 이유 변경되었나요?
파이썬에는 이름 맹글링이라는 개념이 있습니다. Python은 이중 밑줄로 시작하는 변수의 이름을 변경합니다. . 따라서 이름이 이중 밑줄로 시작하는 모든 클래스 변수는 _className\_variableName_ 형식으로 변경됩니다. .
따라서 이 개념은 클래스의 메서드에도 적용됩니다. 다음 코드로 확인할 수 있습니다.
예
class Sample: def __init__(self, a): self.a = a # private method(not really) def __get_a(self): return self.a # creating an instance of the class Sample sample = Sample(5) # invoking the method with correct name print(sample._Sample__get_a()) # invoking the method with wrong name print(sample.__get_a())
출력
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
5 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-19-55650c4990c8> in <module> 14 15 # invoking the method with wrong name ---> 16 print(sample.__get_a()) AttributeError: 'Sample' object has no attribute '__get_a'
결론
이중 밑줄 사용 목적 변수 또는 메서드에 대한 액세스를 제한하지 않습니다. 특정 변수나 메서드가 클래스 내부에서만 바인딩된다는 의미입니다. 튜토리얼에서 질문이 있는 경우 댓글 섹션에 언급하세요.