2017-09-18 1 views
1

J'ai un problème inattendu. Voici le code simplifié:Appelez la classe privée dans exec() python

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() 

personne ne sait comment je peux faire ce travail de code sans se débarrasser de l'instruction exec?

+0

Ce n'est pas une méthode privée. Il n'y a pas de "privé" en Python. –

+0

@Ignacio Vazquez-Abrams c'est le plus proche peut accéder à une fonction privée si vous l'appelez comme obj .__ private() il retournera une erreur – Daan

+0

Ce n'est pas une sorte de privé. Ce n'est pas destiné à rendre les choses privées. Il sert à empêcher les conflits de noms d'attributs lors de l'utilisation de l'héritage multiple. –

Répondre

1

Les noms d'attributs commençant par deux traits de soulignement et ne se terminant pas par deux traits de soulignement sont sujets à name mangling.

Lorsque vous faites

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

dans une définition de classe, vous créez en fait une méthode appelée _<ClassName>__private.

Vous pouvez toujours y accéder normalement __private dans le corps de la classe (en utilisant un qualificatif approprié, comme self, le cas échéant), mais pour l'appeler via exec ou eval, ou à l'extérieur du corps de la classe, vous ll devra utiliser son nom complet:

def public(self): 
    exec('self._test__private()')