python中的受保护方法 [英] Protected method in python
问题描述
Possible Duplicate:
Making a method private in a python subclass
Private Variables and Methods in Python
如何在受保护的python类中定义一个方法,只有子类才能看到它?
How can I define a method in a python class that is protected and only subclasses can see it?
这是我的代码:
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
的子类看到BaseType
的generateCsCode
方法.
I want that just subclasses of BaseType
see the generateCsCode
method of BaseType
.
推荐答案
Python不像C ++/Java/C#那样支持访问保护.一切都是公开的.座右铭是:我们都是成年人."记录下您的课程,并坚持要求您的合作者阅读并遵守该文档.
Python does not support access protection as C++/Java/C# does. Everything is public. The motto is, "We're all adults here." Document your classes, and insist that your collaborators read and follow the documentation.
Python的文化是,以下划线开头的名称意味着:除非您确实知道应该使用这些名称,否则请不要使用它们."您可能选择以下划线开始受保护"方法.但是请记住,这只是一个约定,不会改变方法的访问方式.
The culture in Python is that names starting with underscores mean, "don't use these unless you really know you should." You might choose to begin your "protected" methods with underscores. But keep in mind, this is just a convention, it doesn't change how the method can be accessed.
以双下划线(__name
)开头的名称被修饰,因此可以构建继承层次结构而不必担心名称冲突.有些人将这些用于私有"方法,但同样,它不会改变方法的访问方式.
Names beginning with double underscores (__name
) are mangled, so that inheritance hierarchies can be built without fear of name collisions. Some people use these for "private" methods, but again, it doesn't change how the method can be accessed.
最好的策略是适应必须在单个过程中编写所有代码才能相处的模型.
The best strategy is to get used to a model where all the code in a single process has to be written to get along.
这篇关于python中的受保护方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!