[解決済み] ファンクタを呼び出し可能なクラスとして、またはネストされた関数として作成する [終了] 。
質問事項
Python 3では、このようにクラスを作成することができます。
class foo:
def __init__(self, x):
self.x=x
def __call__(self, y):
self.x = self.x + 1
return (self.x, y)
そして、このような状態でファンクタとして使うことができる。
functor = foo(5)
x = 44354234
print('(1.1) ', functor(7))
print('(1.2) ', functor(8))
print('(1.2) ', functor(9))
実際には、私は関数を返す関数を作りました。しかし、この最初の関数は、実は呼び出し可能なオブジェクトを返すコンストラクタなのです。IMHOでは、開発者がクラスを拡張したり、メソッドを追加したりすることを可能にすることで、これは事態を悪化させる可能性があります。さらに
__init__
のコードの方が、なぜか自然に先行しています。
__call__
を実行する必要があるのですが、クラス構成ではそれが明確ではありません。最後に、Python 3 の「方法」は、クラスよりも関数を使うことを提案しています。
このため、私はこのクラスの関数版を作りました。この方が定型的なコードが少なく、より自然に読めると思います。
def bar(x):
def f(y):
nonlocal x
x = x + 1
return (x,y)
return f
functor2 = bar(5)
x = 345234234
print('(2.1) ', functor2(7))
print('(2.2) ', functor2(8))
print('(2.3) ', functor2(9))
しかし、それは
nonlocal
というのは、私が考えていない理由で直感的に理解できないかもしれません。2番目のアプローチは良い習慣ですか、それとも危険な落とし穴があるのでしょうか?Python 3ではどちらを優先すべきでしょうか?特に、私はほとんど経験がないので
nonlocal
.
解決方法は?
近年のPythonの開発方針は、「他言語のあらゆる機能をPythonに取り込もう」であり、その結果、一つのタスクを様々な方法で達成することができるようになったように見えます。
だから、あることをするのに最適な方法というのはなくて、開発者が何をしたいかによる。ですから
Class
を使用してステートフルな関数を作成し、それを拡張できるようにすることは、状況によっては必要かもしれません。クロージャを
nonlocal
の方が一般的であり、直感的でないことはないでしょう。もうひとつの疑問は、この方法をメソッド・デコレータに使う場合、関数ではより少ないコードしか書けず、クラスではより多くの「マジック」を追加しなければならない、ということです。
self
.
追伸:Pythonでは、関数に属性を持たせることができるので、同じようにコーディングするもう一つの方法は
x
の属性として
f
の代わりにインナー関数
nonlocal
しかし、それはあなたが説明したものよりも一般的なアプローチではありません。
def bar(x):
def f(y):
f.x=f.x+1
return (f.x, y)
f.x=x
return f
EDIT: return文にインデントを追加しました。
関連
-
Python 入出力と高次代入の基礎知識
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] インスタンスのクラス名を取得する?
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python jiabaライブラリの使用方法について説明
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Pythonショートビデオクローラーチュートリアル
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】インポートエラー。モジュール名 urllib2 がない