2017-11-26 12 views
0

クラス名Fooを繰り返さずに、クラスメソッドaddInstances__init__から呼び出したいと思います。クラス名を繰り返さずに__init__からclassmethodを呼び出してください

class Foo(): 
    myInstances = {} 

    @classmethod 
    def addInstance(cls, name, obj): 
     cls.myInstances[name]=obj 

    def __init__(self, name): 
     Foo.addInstance(name, self) # class name "Foo" is repeated 

#use the class 
if __name__ == "__main__": 
    Foo('testName') 
    print(Foo.myInstances) 

上記のコードは、私が期待していることです。ただし、 "Foo"が繰り返されます。

cls.addInstance(name, self) 

でライン

Foo.addInstance(name, self) # class name "Foo" is repeated 

の交換はNameError: name 'cls' is not definedにつながります。

+0

を書くことができますが、 'という' self.addInstances(..) ' – Vinny

答えて

1

限り、あなたはADDINSTANCEをオーバーライドしないようなどの簡単な方法

self.addInstance 

はあまりにも動作します。標準であるC++ このとは異なり -

両方CLS自己が慣習です。あなたがそれらを渡すために持っている理由

明示的- クラスメソッドとメソッドには、それぞれ

あなたはまた、

self.__class__.addInstance 
+0

注意を呼び出すことができます前者はサブクラスでオーバーライドされたメソッドを呼び出すことができないため、self.__ class __。addInstance'は 'self.addInstance'と少し異なります。あなたがしたいことをするフォームを使用してください。ここでの問題は実際には規約ではなく、 'addInstance'という名前の* instance *属性がない場合、PythonはMROを使ってその名前でクラス属性を見つけようとします。 – chepner

+0

@chepner、私はそれが明らかだと思います。 _self_を通してアクセスクラスメソッドを使用しているときに罪悪感を克服するためにOPを助けるために:-) – volcano

関連する問題