2011-01-09 4 views
8

は、クラス内にプライベートクラス変数を保持し、それをデフォルト以外の変数のデフォルト値として使用する方法ですクラス)?Pythonでデフォルト以外の引数としてクラス変数を使用する

例:

class a: 
    def __init__(self): 
     self.__variable = 6 
    def b(self, value = self.__variable): 
     print value 
+5

をused.'されるデフォルトを起こすことなく、bに渡すことができます。まったく。あなたが使用している二重のアンダースコアは変数を非公開にしない**、ネームの衝突を避けるために名前を変更するだけです。 理由が分からない限り、二重下線は使用しないでください。 ;) –

+0

大きな質問! (まあ、それは私が持っていたので、大きな問題を解決した...) – nchpmn

答えて

14

あなたは、問題をoverthinkingしている:

class a: 

    def __init__(self): 
     self.__variable = 6 

    def b(self, value=None): 
     if value is None: 
      value = self.__variable 
     print value 
+0

うわー。失敗した。ありがとう! – calccrypto

4
  1. self.__variableはインスタンス変数ではなく、クラス変数です。
  2. デフォルト引数が機能メソッド定義時に評価されているので、デフォルトの引数としてインスタンス変数を使用することはできません - 少なくとも直接ではなく、(通常のトリックを、Noneをデフォルトと機能本体にif arg is None: arg = real_defaultを追加し、作業を行います)。
  3. 先頭の二重下線は「プライベート」を意味するものではなく、「名前を変えて問題を尋ねる」という意味です。私が何を意味しているのか正確に分からなければ、この「機能」を使用してはいけません。意図された使用はではなく、プライベートメンバーです - そのために1つのアンダースコアを使用してください。
+0

それでは、**は意図された用途ですか? –

+1

@Karl:サブクラスで名前の衝突を防ぐ。例えば、 http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiersまたはhttp://docs.python.org/tutorial/classes.html?highlight=mangling#private-variables(3番目の段落)。 – delnan

+0

私は1つのサブスコープしか使わない場合でも変数にアクセスできます – calccrypto

3

Noneが許容される引数の範囲内になるようにするには、コード内の他の目的に使用されないカスタムセンチネル値を作成することができます。これを行わないとvalueNonebから返されることはありません。

UseDefault = object() 

# Python 3? Otherwise, you should inherit from object unless you explicitly 
# know otherwise. 
class a:  
    def __init__(self): 
     self._variable = 6 

    def b(self, value=UseDefault): 
     if value is UseDefault: 
      value = self._variable 
     print value 

は今NoneはPythonが** **プライベートクラス変数を持っていない

関連する問題