2009-08-03 9 views
0

は、私はPythonでクラスメソッドでクラスにSETATTRような何かをしたかったが、このクラスは、私は基本的に得る存在しません:Pythonのクラスメソッドでクラスを変更する方法はありますか?

NameError: global name 'ClassName' is not defined 

は、クラスを変更するためのクラスメソッドのための方法はありますか?それが、このような何かが実際に動作します:

class Bla(object): 
    @classmethod 
    def cm(cls,value): 
     cls.storedValue = value 

Bla.cm("Hello") 

print Bla.storedValue # prints "Hello" 

編集

class ClassName(object): 
    def HocusPocus(name): 
     setattr(ClassName, name, name) 

    HocusPocus("blah") 
    HocusPocus("bleh") 
+1

何をしようとしているかを示す小さな完全な例を投稿してください。 –

答えて

5

クラスメソッドは、最初の引数として渡されたクラスを取得し、私は今、あなたの問題を理解すると思います。私はそれを正しく取得した場合、あなたがしたいすべてが、このさ:Pythonで

class Bla(object): 
    storedValue = "Hello again" 

print Bla.storedValue # prints "Hello again" 

クラスの作成は(ほとんど)単に意味:

  1. を新鮮な名前空間を作成します。
  2. このネームスペースを使用してクラス本体内にあるコードを実行してください。
  3. 名前空間に残っているものはすべてクラス属性としてクラスに入れてください。 storedValueは、ステップ2の後に名前空間のあるので、これらはのみ使用可能ですけれども

は、それは、3

+0

Blaの本体にcmを実行する方法はありますか? – Pablo

+0

意図した結果ではありません(Blaはまだ存在しません)。しかし、単にクラス作成時にクラス属性storedValueを設定したいのであれば、本体でstoredValue = "Hello"と言っても何の問題はありませんか? – balpha

+0

私の答えを編集してください。 – balpha

0

あなたがclass decoratorを使用することですこれを行うことができます別の方法ステップで、class属性になっていますPython 2.6以降IIRCから。

このような何か:

def addattributes(cls): 
    cls.foobar = 10 
    return cls 

@addattributes 
class MyClass(object): 
    pass 

print MyClass.foobar 

この最も有用なこの種のあなたには、いくつかの特定の機能/プロパティを持つクラスの数を「飾る」にしたいです。あなたの場合、これを一度しかやりたくない場合は、前に示したクラスメソッドを使いたいかもしれません。多くの良い提案が進められているが

0

、最も近いものが最初にコードを要求したに取得することができ、それは次のようになります。私は、神秘的な...と仮定してい

class ClassName(object): 

    def HocusPocus(name): 
     return property(fget=..., fset=...) 

    blah = HocusPocus("blah") 
    bleh = HocusPocus("bleh") 

を:

class ClassName(object): 
    def HocusPocus(name): 
     setattr(ClassName, name, property(fget=..., fset=...)) 

    HocusPocus("blah") 
    HocusPocus("bleh") 

はこれです編集された部分もnameにアクセスする必要があります(そうでなければ、引数として渡す必要はありません)。

重要なことは、クラス本体内では、HocusPocusはまだ単なる関数であることです(クラス本体が実行終了するまでクラスオブジェクトが存在しないため、本体は本質的にローカルで実行されている関数本体のようですdict [実際の関数のローカルでPythonコンパイラが一般的に実行する名前空間の最適化なしで、セマンティクスを単純化するだけです!])、特にその本体内で呼び出すことができ、値を返すことができ、 (クラス本体のローカル変数に、ボディの実行終了時にクラス属性になる)など

あなたはClassName.HocusPocusあなたはクラス本体内にそれを実行し終わったときにちょうどdelステートメントを追加し、周りの後にぶら下げたくない場合(例えばクラス本体の最後のステートメントとして):

del HocusPocus 
+0

あなたは自分自身を繰り返す必要があるという問題があります:blahと "blah"。 – Pablo

+0

もう一つの問題は、オブジェクトに属性名を取得して設定するfgetとfsetを書く方法がないことです。 – Pablo

関連する問題