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
.
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.
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.