Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python 프로그램의 개인 변수


이 튜토리얼에서는 비공개 변수 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'

결론

이중 밑줄 사용 목적 변수 또는 메서드에 대한 액세스를 제한하지 않습니다. 특정 변수나 메서드가 클래스 내부에서만 바인딩된다는 의미입니다. 튜토리얼에서 질문이 있는 경우 댓글 섹션에 언급하세요.