2012-07-14 6 views
18

可能性の重複:
Making a method private in a python subclass
Private Variables and Methods in 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のちょうどサブクラスがBaseTypegenerateCsCode方法を参照することを望みます。

+0

@jamylakいいえいいえいいえいいえいいえ私はちょうど保護されたメソッドを定義する方法を言う、私はアンダースコアについて知っている – Pooya

+0

なぜマイナス???どうして?それは私の問題であり、たくさん検索して何も見つかりませんでした。 – Pooya

+1

@Pooya:答えがあります:あなたはPythonでこれをしません。より大きな問題を説明し、Pythonに適したソリューションを見つけるのを手助けすることができます。 –

答えて

55

PythonはC++/Java/C#のようにアクセス保護をサポートしていません。すべてが公開されています。モットーは、「私たちはここではすべて大人だ」クラスを文書化し、共同作業者がドキュメントを読んで従うことを主張します。

Pythonの文化は、アンダースコアで始まる名前は、「あなたが本当にわかっていなければ、これらを使用しないでください」という意味です。保護されたメソッドをアンダースコアで開始することもできます。ただし、これは単なる規約であり、メソッドにどのようにアクセスできるかは変わりません。

二重アンダースコア(__name)で始まる名前は、名前の衝突の恐れなしに継承階層を構築できるように、マングルされています。一部の人々はこれらを「プライベート」メソッドに使用しますが、メソッドにアクセスする方法は変わりません。

ベストプラクティスは、単一のプロセス内のすべてのコードを取得する必要があるモデルに慣れることです。

+0

はい私は_と__について知っていますが、私のメソッドを保護する方法を知りたいのですが、正確にはJavaで保護されています。 – Pooya

+29

答えはとてもシンプルで、提供されています。 –

10

できません。 Pythonは意図的にアクセス制御をサポートしていません。慣習では、アンダースコアで始まるメソッドはプライベートなので、メソッドを使用するはずのドキュメントを明確に記述する必要があります。

+3

慣例では、1つのアンダースコアは保護されているとみなされ、2つのアンダースコアはプライベートと見なされます。 –

+0

@l__flex__l:インスタンス属性の二重先頭アンダースコアは、非常に特定のセマンティクスで名前のマングリングを呼び出します。大会ではなく、言葉遣いの一部です。 PEP 8によると、先頭のアンダースコアの1つは「弱い内部使用指標」です。私は、C++の "保護された"アクセス修飾子と "個人的な"アクセス修飾子には有益な類推はないと思います。 –

+3

PEP 8で、「継承のための設計」のセクションをチェックしてください。特に、「別のカテゴリの属性」は、「サブクラスAPI」の一部であるものです(他の言語では**「保護された**」と呼ばれることもあります)。私には、このセクションでは保護された属性について説明しています。また、他の多くの人はそう信じる[この男のように](http://radek.io/2011/07/21/private-protected-and-public-in-python/)。私はインターネット上の記事が決して証拠ではないことを知っている。しかし、十分な人々がこれに同意するので、定義上は条約ではありませんか? –