Programing

Python의 전용 변수 및 메서드

crosscheck 2020. 11. 18. 08:34
반응형

Python의 전용 변수 및 메서드


중복 가능성 :
Python에서 객체 이름 앞의 단일 및 이중 밑줄의 의미

Python의 private 멤버 및 메서드에 대해 _foo (밑줄) 또는 __bar (이중 밑줄)를 사용해야합니까?


파이썬에는 "비공개 방법"과 같은 것은 없습니다. 이중 밑줄은 이름 변경입니다.

>>> class A(object):
...     def __foo(self):
...         pass
... 
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()

따라서 __접두사는 예를 들어 상속 체인 위 또는 아래의 이름과 충돌하지 않기 위해 맹 글링이 필요할 때 유용합니다. 다른 용도의 경우 단일 밑줄이 더 좋습니다, IMHO.

편집에 혼란에 대한 __, PEP-8 확실히 그에 분명하다 :

클래스가 하위 클래스로 지정되고 하위 클래스에서 사용하지 않으려는 속성이있는 경우 이중 선행 밑줄과 후행 밑줄없이 이름을 지정하는 것이 좋습니다. 이것은 파이썬의 이름 변경 알고리즘을 호출하는데, 여기서 클래스의 이름이 속성 이름으로 변경됩니다. 이렇게하면 하위 클래스에 이름이 같은 속성이 실수로 포함 된 경우 속성 이름 충돌을 방지 할 수 있습니다.

참고 3 : 모든 사람이 이름 맹 글링을 좋아하는 것은 아닙니다. 우발적 인 이름 충돌을 피해야하는 필요성과 고급 발신자가 사용할 가능성의 균형을 맞추십시오.

따라서 하위 클래스가 실수로 동일한 이름으로 자신의 메서드를 다시 정의 할 것으로 예상하지 않는 경우에는 사용하지 마십시오.


이중 밑줄. __fieldName클래스 외부에서 단순히 액세스 할 수없는 방식으로 이름을 엉망으로 만들며, 개인이 되려면 시작하고 싶은 것입니다. (여전히 현장에 접근하기가 그리 어렵지는 않지만)

class Foo:
    def __init__(self):
        self.__privateField = 4;
        print self.__privateField # yields 4 no problem

foo = Foo()
foo.__privateField
# AttributeError: Foo instance has no attribute '__privateField'

_Foo__privateField대신에 액세스 할 수 있습니다 . 그러나 그것은 "나는 개인입니다"라고 외치는 것보다 낫습니다.


이중 밑줄. 그것은 이름을 엉망으로 만듭니다. 변수에 여전히 액세스 할 수 있지만 일반적으로 그렇게하는 것은 좋지 않습니다.

semi-private에는 단일 밑줄을 사용하고 (python 개발자는 "꼭 필요한 경우에만 변경해야 함") 완전 비공개에는 두 배를 사용합니다.


그게 코딩 규칙이기 때문입니다. 자세한 내용은 여기참조 하십시오 .

참고 URL : https://stackoverflow.com/questions/3385317/private-variables-and-methods-in-python

반응형