在python受保护的方法[复制](Protected method in python [dupl

2019-06-26 06:37发布

可能重复:
制作方法在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

我想这只是一个子类BaseTypegenerateCsCode的方法BaseType

Answer 1:

作为C ++ / Java的/ C#不Python不支持访问保护。 一切都是公开的。 座右铭是,“我们这里都是成年人。” 记录您的班级,坚持你的合作者阅读和遵守的文件。

Python中的文化是开始用下划线名字的意思是,“不使用这些设置,除非你真的知道你应该。” 您可以选择用下划线开始你的“保护”的方法。 但请记住,这只是一个惯例,它不会改变的方法如何被访问。

双下划线(开头的名称__name )的错位,使继承层次结构而不必担心名称冲突的构建。 有些人用这些为“私有”的方法,但再次,它不改变方法如何被访问。

最好的策略是习惯一种模式,在一个单一的过程中所有的代码已被写入相处。



Answer 2:

你不能。 Python中故意不支持访问控制。 按照惯例,开始用下划线方法是私有的,你应该是谁应该使用方法的文档中明确说明。



文章来源: Protected method in python [duplicate]