我々は1がこのような機能の属性を設定することができることを知っている:この関数を定義するときに関数の属性を設定するにはどうすればよいですか?
def foo():
pass
foo.__setattr__("nameattr","myname")
今、私はこのようにそれを設定したいと思います:
def foo():
#self.__setattr__("nameattr","myname")
pass
は、任意の解決策はありますか?
我々は1がこのような機能の属性を設定することができることを知っている:この関数を定義するときに関数の属性を設定するにはどうすればよいですか?
def foo():
pass
foo.__setattr__("nameattr","myname")
今、私はこのようにそれを設定したいと思います:
def foo():
#self.__setattr__("nameattr","myname")
pass
は、任意の解決策はありますか?
あなただけの関数の本体内で割り当てを置くことができます。
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
をあなたはドン場合は属性が設定されていない見ることができるように関数にアクセスする前に関数を呼び出す必要はありません。さらに、いつもの値は変わるかもしれません。
一度だけ属性を設定する場合は、デコレータを使用できます。 partial
をsetattr
と併用すると便利ですが、残念ながら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
ありがとう、私はデコレータまたはメタクラスを使用すると考えていた。私はそれがclass.Pardonのように継承することができると考えていた私はちょうど初心者であり、いくつかの幻想を持っています。 – hurrytospring
関数はインスタンスを持たず、入力(または入力なし)と計算のみを行います。クラスとしてこれを行います。
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'
あなたの答えをありがとうございます。しかし、私は実際に望んでいない。実際には、フラスコを使用するとき、私はそれ自身のURL属性を宣言する応答関数を作成する必要があります。 – hurrytospring
あなたはできます: 'def foo():foo.nameattr = myname'。しかし、その属性は関数を呼び出すたびに設定されます。さらに、関数を呼び出さなければ、属性は設定されません! – Bakuriu