2016-11-09 13 views
0

我々は1がこのような機能の属性を設定することができることを知っている:この関数を定義するときに関数の属性を設定するにはどうすればよいですか?

def foo(): 
    pass 
foo.__setattr__("nameattr","myname") 

今、私はこのようにそれを設定したいと思います:

def foo(): 
    #self.__setattr__("nameattr","myname") 
    pass 

は、任意の解決策はありますか?

+0

あなたはできます: 'def foo():foo.nameattr = myname'。しかし、その属性は関数を呼び出すたびに設定されます。さらに、関数を呼び出さなければ、属性は設定されません! – Bakuriu

答えて

0

あなただけの関数の本体内で割り当てを置くことができます。

def foo(): 
    foo.nameattr = value 

または:

def foo(): 
    setattr(foo, "nameattr", value) 

必要ありませんo __setattr__を明示的に呼び出します。

注しかし、これは毎回あなたがこれが動作するための関数を呼び出すなければなりません。また、関数を呼び出す属性を設定すること:

>>> a = 1 
>>> def foo(): 
...  global a 
...  foo.a = a 
... 
>>> foo.a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'function' object has no attribute 'a' 
>>> foo() 
>>> foo.a 
1 
>>> a = 2 
>>> foo.a 
1 
>>> foo() 
>>> foo.a 
2 

をあなたはドン場合は属性が設定されていない見ることができるように関数にアクセスする前に関数を呼び出す必要はありません。さらに、いつもの値は変わるかもしれません。

一度だけ属性を設定する場合は、デコレータを使用できます。 partialsetattrと併用すると便利ですが、残念ながらsetattrは位置限定の引数を使用します。しかし、私たちは独自のラッパーを書くことができます:

from functools import partial 

def set_attribute(object, name, value): 
    setattr(object, name, value) 

@partial(set_attribute, name="a", value=1) 
def foo(): 
    pass 

print(foo.a) # -> 1 
+0

ありがとう、私はデコレータまたはメタクラスを使用すると考えていた。私はそれがclass.Pardonのように継承することができると考えていた私はちょうど初心者であり、いくつかの幻想を持っています。 – hurrytospring

0

関数はインスタンスを持たず、入力(または入力なし)と計算のみを行います。クラスとしてこれを行います。

In [7]: class Foo(object): 
    ...:  def __init__(self): 
    ...:   self.__setattr__("nameattr", "myname") 
    ...:   

In [8]: foo = Foo() 

In [9]: foo.nameattr 
Out[9]: 'myname' 

これを行うには、この通常の方法は次のとおりです。

In [10]: class Foo(object): 
    ....:  def __init__(self, name): 
    ....:   self.name = name 
    ....:   

In [11]: foo = Foo("John") 

In [12]: foo.name 
Out[12]: 'John' 
+0

あなたの答えをありがとうございます。しかし、私は実際に望んでいない。実際には、フラスコを使用するとき、私はそれ自身のURL属性を宣言する応答関数を作成する必要があります。 – hurrytospring

関連する問題