2016-03-30 5 views
0

私はこのコードに出会ったときに、私にはあまり明確ではないいくつかのことがあります。ここでは、コードは次のとおりです。Pythonのインスタンスと未定義のパラメータ

class TypeVariable(object): 
    #A type variable standing for an arbitrary type. 
    #All type variables have a unique id, but names are only assigned lazily, 
    #when required. 

    next_variable_id = 0 

    def __init__(self): 
     self.id = TypeVariable.next_variable_id 
     TypeVariable.next_variable_id += 1 
     self.instance = None 
     self.__name = None 

    next_variable_name = 'a' 

    @property 
    def name(self): 
     #Names are allocated to TypeVariables lazily, so that only TypeVariables present 
     if self.__name is None: 
      self.__name = TypeVariable.next_variable_name 
      TypeVariable.next_variable_name = chr(ord(TypeVariable.next_variable_name) + 1) 
     return self.__name 

なぜdef __init__(self):は、パラメータとしてnameを持っていないが、上記のコードでself.__name = Noneがありますでしょうか?

また、self.instanceの意味は、インスタンスと呼ばれる属性があることを思い出していないためです。

私はJavaに精通しているので、誰かがこのコードの機能を理解するのを手伝ってください。ありがとう

答えて

0
self.instance = None 
self.__name = None 

デフォルト値を持つオブジェクト属性だけです。クラスインスタンスの構築に必須でない場合は、パラメータを__init__()に入れる必要はありません。

+2

'@ property'が存在すると仮定して' self .__ name'が最低限必要です。 'name'の実装は、' __init__'で初期化することが保証されていなければ変更する必要があります。 – ShadowRanger

3

このコードには、self.instanceという文脈はありません。 self.__nameについては、propertyの定義では、順次名をインスタンスに遅延割り当てしていることが明らかになりました。 __nameNoneに設定して、初期化されていないことを認識します。 self.nameにアクセスすると、プレースホルダを認識し、新しい値で置き換えて新しい値を返します。 のすべてのインスタンス属性にいくつかの代入を与えることは、インスタンスが持つ可能性のある属性を把握するのが非常に難しいかもしれないので、Pythonでは良いフォームと考えられます。現代のPython(3.3以降)では、そうすることでメモリを節約できます。すべての属性が__init__で初期化され、__init__の後に新しい属性が追加されない限り、すべてのインスタンスの__dict__key-sharing dictionaryであり、各インスタンスのコストを大幅に削減します(実装の詳細は約3分の2です)。したがって、他のメソッド/プロパティがinstanceに設定されている場合は、保守者が何を持っているかを知るために、__init__に初期化し、Py3.3 +のメモリ消費量を減らすことをお勧めします。

+0

こんにちは、私は 'def __init __(self)'をJavaのコンストラクタとして考えることができます。もしそうなら、どのようにしてコンストラクタで操作を追加できますか? –

+1

@AndaZhao:技術的には、 '__init__'は初期化子です。生のオブジェクトは呼び出される前に作成されます(これは 'self'を受け取る方法です)。 Pythonは、(__init__は複数回呼び出すことができ、不変性に違反する)またはキャッシュされた/シングルトンのオブジェクト( '__new__' can新しいオブジェクトを作成するだけでなく、既存のオブジェクトを返す)。しかし、いずれにせよ、PythonはJavaとは異なり、一般的に事前にインスタンス属性名を定義していません。いつでも任意の属性を定義できます。 – ShadowRanger

関連する問題