关于oop:python中的保护方法

Protected method in python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Making a method private in a python subclass
Private Variables and Methods in Python

如何在受保护的Python类中定义一个方法,并且只有子类才能看到它?

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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的子类见BaseTypegenerateCsCode方法。


Python不支持C++///C/爪哇的访问保护。一切都是公开的。格言是,"我们都是成年人在这里。"记录你的课程,坚持让你的合作者阅读并遵循文档。

python的文化是,以下划线开头的名称意味着"除非您真的知道应该这样做,否则不要使用这些下划线。"您可以选择以下划线开头"受保护"的方法。但请记住,这只是一个约定,它不会改变方法的访问方式。

以双下划线(__name开头的名称会被破坏,这样就可以在不担心名称冲突的情况下构建继承层次结构。有些人将这些方法用于"私有"方法,但同样,它不会改变方法的访问方式。

最好的策略是习惯于一个模型,在这个模型中,一个流程中的所有代码都必须被写下来才能共存。


不能。python故意不支持访问控制。按照惯例,以下划线开头的方法是私有的,您应该在文档中清楚地说明应该使用该方法的人。