794

シンボルを使用した Python コードを見ています@が、それが何をするのかわかりません。@また、シンボルが含まれているとPythonドキュメントを検索したり、Googleが関連する結果を返さないため、何を検索すればよいかわかりません。

4

14 に答える 14

450

@行頭の記号は、クラス、関数、およびメソッドのデコレータに使用されます。

ここでもっと読む:

PEP 318: デコレータ

Python デコレータ

遭遇する最も一般的な Python デコレータは次のとおりです。

@財産

@クラスメソッド

@静的メソッド

行の途中にが表示されている場合@、それは別のもので、行列の乗算です。二項演算子としての使用を示すこの回答を参照してください。@

于 2011-06-17T23:23:44.947 に答える
412

class Pizza(object):
    def __init__(self):
        self.toppings = []

    def __call__(self, topping):
        # When using '@instance_of_pizza' before a function definition
        # the function gets passed onto 'topping'.
        self.toppings.append(topping())

    def __repr__(self):
        return str(self.toppings)

pizza = Pizza()

@pizza
def cheese():
    return 'cheese'
@pizza
def sauce():
    return 'sauce'

print pizza
# ['cheese', 'sauce']

これは、デコレータの後に定義している//が、基本的に記号の直後のfunction/に渡されることを示しています。methodclassargumentfunctionmethod@

最初の目撃

マイクロフレームワークFlaskは、次の形式で最初からデコレーターを導入します。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

これは、次のように変換されます。

rule      = "/"
view_func = hello
# They go as arguments here in 'flask/app.py'
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
    pass

これを実現することで、ようやく Flask に安心感を覚えることができました。

于 2013-04-05T17:15:18.347 に答える
241

このコード スニペット:

def decorator(func):
   return func

@decorator
def some_func():
    pass

次のコードと同等です。

def decorator(func):
    return func

def some_func():
    pass

some_func = decorator(some_func)

デコレーターの定義では、通常は関数によって返されない変更されたものを追加できます。

于 2013-02-10T15:47:31.100 に答える
231

@Python 3.5では、演算子としてオーバーロードできます。行列の乗算を行うように設計されているため、という名前が付けられて__matmul__いますが、任意のものにすることができます。詳細はPEP465を参照してください。

これは行列乗算の単純な実装です。

class Mat(list):
    def __matmul__(self, B):
        A = self
        return Mat([[sum(A[i][k]*B[k][j] for k in range(len(B)))
                    for j in range(len(B[0])) ] for i in range(len(A))])

A = Mat([[1,3],[7,5]])
B = Mat([[6,8],[4,2]])

print(A @ B)

このコードは次の結果をもたらします。

[[18, 14], [62, 66]]
于 2015-03-11T20:51:38.050 に答える
5

デコレータを使用していることを示します。これは2008 年の Bruce Eckel の例です。

于 2011-06-17T23:22:51.297 に答える