Защищенный метод в python

Возможный дубликат:
Создание метода private в подклассе python
Частные переменные и методы на Python

Как я могу определить метод в классе python, который защищен, и только подклассы могут его видеть?

Это мой код:

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

Я хочу, чтобы только подклассы BaseType рассматривали метод generateCsCode BaseType.

Ответы

Ответ 1

Python не поддерживает защиту доступа, как это делает С++/Java/С#. Все открыто. Девиз: "Мы все взрослые здесь". Документируйте свои классы и настаивайте на том, чтобы ваши соавторы читали и следили за документацией.

Культура в Python заключается в том, что имена, начинающиеся с подчеркивания, означают "не используйте их, если вы действительно не знаете, что должны". Вы можете начать использовать "защищенные" методы с помощью символов подчеркивания. Но имейте в виду, это просто соглашение, оно не меняет способ доступа к этому методу.

Имена, начинающиеся с двойных подчеркиваний (__name), искажены, поэтому иерархии наследования могут быть построены без страха коллизий имен. Некоторые используют эти методы для "private", но опять же, это не изменяет способ доступа к этому методу.

Лучшей стратегией является привыкание к модели, где весь код в одном процессе должен записываться, чтобы ладить.

Ответ 2

Вы не можете. Python намеренно не поддерживает контроль доступа. По соглашению методы, начинающиеся с подчеркивания, являются частными, и вы должны четко указать в документации, которая должна использовать этот метод.