可能性のある複製:
python subclass でメソッドをプライベートにする
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
メソッドを参照してください。
Pythonは、C++/Java/C#のようにアクセス保護をサポートしません。すべてが公開されています。モットーは、「私たちは皆ここに大人です」です。クラスを文書化し、共同編集者が文書を読んで従うことを主張します。
Pythonの文化では、アンダースコアで始まる名前は、「本当に必要がある場合を除き、これらを使用しないでください。」という意味です。念頭に置いて、これは単なる慣習であり、メソッドへのアクセス方法を変更するものではありません。
二重アンダースコア(__name
)はマングルされているため、名前の衝突を恐れることなく継承階層を構築できます。一部の人々はこれらを「プライベート」メソッドに使用しますが、再び、メソッドへのアクセス方法は変わりません。
最善の戦略は、1つのプロセス内のすべてのコードを記述しなければならないモデルに慣れることです。
できません。 Python意図的にアクセス制御をサポートしていません。慣例により、アンダースコアで始まるメソッドはプライベートであり、ドキュメント内でメソッドを使用するユーザーを明確に指定する必要があります。