2017-09-18 1 views
1

예기치 않은 문제가 있습니다. 이 단순화 된 코드 :exec()의 private class 함수를 호출합니다. 파이썬

class test(): 
    def __init__(self,name): 
     self.name = name 

    def __private(self): 
     print(self.name) 

    def public(self): 
     exec("self.__private()") 

obj = test('John') 
obj.public() 

사람 내가 간부 문 치우는없이 코드가 작동 할 수있는 방법을 알고 있나요?

+0

개인적인 방법은 아닙니다. 파이썬에는 "private"같은 것이 없습니다. –

+0

@Ignacio Vazquez-Abrams obj .__ private()과 같이 호출하면 private 함수에 접근 할 수있는 가장 가까운 함수입니다. – Daan

+0

private가 아닙니다. 사물을 비공개로 만들기위한 것이 아닙니다. 다중 상속을 사용할 때 속성 이름 충돌을 방지하기위한 것입니다. –

답변

1

두 개의 밑줄로 시작하고 두 개의 밑줄로 끝나지 않는 속성 이름은 name mangling입니다.

당신이 클래스 정의에

def __private(self): 
    print(self.name) 

을 수행 할 때, 당신은 실제로 _<ClassName>__private라는 방법을 만들 수 있습니다.

당신은 여전히 ​​(적절한 규정과 같은 self을 사용하여, 해당되는 경우) 클래스 본문 내에서 __private로 일반적으로 액세스하지만 exec 또는 eval를 통해 호출하기 위해 수 있으며, 클래스 신체의 외부, 당신 '

관련 문제