web-dev-qa-db-fra.com

Méthode protégée dans python

Duplicata possible:
Rendre une méthode privée dans une sous-classe python
Variables et méthodes privées en Python

Comment puis-je définir une méthode dans une classe python qui est protégée et que seules les sous-classes peuvent la voir?

Voici mon code:

class BaseType(Model):
    def __init__(self):
        Model.__init__(self, self.__defaults())


    def __defaults(self):
        return {'name': {},
                'readonly': {},
                'constraints': {'value': UniqueMap()},
                'cType': {}
        }


    cType = property(lambda self: self.getAttribute("cType"), lambda self, data:              self.setAttribute('cType', data))
    name = property(lambda self: self.getAttribute("name"), lambda self, data: self.setAttribute('name', data))
    readonly = property(lambda self: self.getAttribute("readonly"),
                        lambda self, data: self.setAttribute('readonly', data))

    constraints = property(lambda self: self.getAttribute("constraints"))

    def getJsCode(self):
        pass

    def getCsCode(self):
        pass


    def generateCsCode(self, template=None, constraintMap=None, **kwargs):
        if not template:
            template = self.csTemplate

        if not constraintMap: constraintMap = {}
        atts = ""

        constraintMap.update(constraintMap)

        for element in self.getNoneEmptyAttributes():
            if not AbstractType.constraintMap.has_key(element[0].lower()):
                continue
            attTemplate = Template(AbstractType.constraintMap[element[0].lower()]['cs'])
            attValue = str(element[1]['value'])
            atts += "%s  " % attTemplate.substitute({'value': attValue})

        kwargs.update(dict(attributes=atts))

        return template.substitute(kwargs)



class  MainClass(BaseType, Model):
    def __init__(self):
        #Only Model will initialize
        Model.__init__(self, self.__defaults())
        BaseType.__init__(self)

    def __defaults(self):
        return {'name': {},
                'fields': {'value': UniqueMap()},
                'innerClass': {'value': UniqueMap()},
                'types': {}
        }

    fields = property(lambda self: self.getAttribute("fields"))
    innerClass = property(lambda self: self.getAttribute("innerClass"))
    types = property(lambda self: self.getAttribute("types"))


    @staticmethod
    def isType(iType):
    #        return type(widget) in WidgetSelector.widgets.itervalues()
        return isinstance(iType, AbstractType)

    def addType(self, type):
        if not MainClass.isType(type):
            raise Exception, "Unknown widget type %s" % type
        self.types[type.name] = type

Je veux juste des sous-classes de BaseType voir la méthode generateCsCode de BaseType.

30
Pooya

Python ne prend pas en charge la protection d'accès comme le fait C++/Java/C #. Tout est public. La devise est: "Nous sommes tous des adultes ici." Documentez vos cours et insistez pour que vos collaborateurs lisent et suivent la documentation.

La culture dans Python est que les noms commençant par des traits de soulignement signifient, "ne les utilisez pas à moins que vous ne sachiez vraiment que vous devriez." Vous pouvez choisir de commencer vos méthodes "protégées" avec des soulignés. Mais gardez à l'esprit, ce n'est qu'une convention, cela ne change pas la façon dont la méthode est accessible.

Noms commençant par un double soulignement (__name) sont mutilés, de sorte que les hiérarchies d'héritage peuvent être construites sans crainte de collisions de noms. Certaines personnes les utilisent pour des méthodes "privées", mais là encore, cela ne change pas la façon dont la méthode est accessible.

La meilleure stratégie consiste à s'habituer à un modèle où tout le code dans un seul processus doit être écrit pour s'entendre.

73
Ned Batchelder

Tu ne peux pas. Python ne prend pas intentionnellement en charge le contrôle d'accès. Par convention, les méthodes commençant par un trait de soulignement sont privées, et vous devez clairement indiquer dans la documentation qui est censé utiliser la méthode.

12
Sven Marnach