問題タブ [setattr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python で属性の作成を制限するための __setattr__ と __slots__ の比較
特に、ユーザーが新しい属性を動的に作成できないようにすることで、Python クラスの動的性を低下させる方法について読んでいます。オーバーロード__setattr__
はこれを行う良い方法であり、進むべき道で__slots__
はないことを読みました。この最後のスレッドの1 つの投稿は、__slots__
ピクルス化を中断する可能性があることを実際に示唆しています。(誰かこれを確認できますか?)
ただし、Python 2.2 の whatsnew を読んだだけで、属性アクセス セクション__slots__
では、他の人が提案したような最適化のためだけでなく、属性の作成を制限する目的で使用することを実際に提案しています。Python の歴史に関して言えば、Python の当初の意図を知っている人はい__slots__
ますか? 変数の作成を制限することは、悪用される機能またはバグですか? 人々は実際にどのように__slots__
使用されてきましたか? __setattr__
属性の作成を制限するためにオーバーロードされているのを多くの人が見たことがありますか? どれが一番いいですか?いずれかの方法に精通している場合は、知っている方法の長所と短所を自由に投稿してください. また、問題を解決する別の方法がある場合は、共有してください! (そして、そのマイナス面を繰り返さないようにしてください__slots__
他のスレッドで表現されています。)
編集:「なぜ?」の議論を避けたいと思っていましたが、最初の回答はこれが発生することを示しているので、ここに記載します。問題のプロジェクトでは、これらのクラスを使用して「構成情報」を保存し、ユーザーが (ユーザーの) パラメータを使用してオブジェクトに属性を設定し、オブジェクトをプログラムの別の部分に渡すことができるようにします。オブジェクトはパラメーターを格納するだけではないため、辞書は機能しません。ユーザーが誤って属性名を間違って入力し、プログラムが期待する属性の 1 つを設定するのではなく、新しい属性を作成してしまうという事例が既に発生しています。これは検出されないため、ユーザーはパラメーターを設定していると思いますが、期待される結果が表示されません。これはユーザーを混乱させ、見つけにくいものです。
EDIT 2, re pickling: これらのオブジェクトは、将来保存したいものになるでしょう。明らかに最善の解決策である場合__slots__
、おそらく別の保存方法を見つけることができますが、酸洗いは間違いなく価値があり、考慮に入れておく必要があります.
EDIT 3:メモリの節約は問題ではないことにも言及する必要があります。これらのオブジェクトはほとんど作成されないため、節約されるメモリはごくわずかです (3 ~ 12 GB のマシンで数十キロバイトのように)。
python - setattr を使用してメソッドの一部のパラメーターを固定する
パラメーター化されたテストを自動的に生成するために、既存のメソッドのいくつかのパラメーターを凍結することにより、クラスにメソッドを追加しようとしています。これがPython 3コードの一部です
ただし、次の行はかなり期待外れの出力を生成します
"9" を出力します ("0" ではなく)。私は何か間違ったことをしているに違いありませんが、何がわかりません。手伝ってくれますか ?
どうもありがとう
編集:この質問は確かに重複しています。生の回答よりもはるかに深いすべてのコメントの質に感謝したいと思います。
python - マヤのフロートとダブルの違いは何ですか?
Maya では、setAttr() コマンドを使用する場合、float と double を変数タイプとして使用できます。違いはなんですか?ドキュメントの例は同じものです。
-type float3
-type double3
http://download.autodesk.com/global/docs/maya2014/en_us/CommandsPython/index.html
ありがとうございました!
python - Python で __setattr__ を使用した属性エイリアシング
x、yとして公開したいさまざまな内部変数を持つPythonクラスがあります。簡単な例は次のとおりです。
__getattr__
は self のメンバーにアクセスするため、これは機能しないと思っていたでしょう。ただし、 a を定義しようとしない限り、すべてが機能します__setattr__
- と等しくしただけでも、pass
再帰が発生します。どのように実装すればよい__setattr__
ですか? 特に、キーが x または y でない場合、何を呼び出す必要がありますか?
また、一般的に私の質問は、これが次のような望ましい動作を実装する正しい方法であるかどうかです。
またはより良い代替手段があるかどうか。私はpython 2.7.5を使用しています。ありがとう!
python - 関数で「eval」を置き換えるにはどうすればよいですか?
eval
Python で使用するのは良い習慣ではないことをよく知っています。これが私のコードです:
機能については聞いたことがありsetattr
ますが、正直なところ、実装方法がわかりません。
map
関数を使用してこれを行うことも可能ですか?
'md5', 'sha1', 'sha224'
etc はローカル変数であることに注意してください。それらの1つで関数を使用しているときeval
、それらは関数になります。
python - 動的に作成された関数を使用してプロパティを動的に追加する
次のように機能するものを実装したいと思います。
に触発されました: http://znasibov.info/blog/html/2010/03/10/python-classes-dynamic-properties.html および 動的な名前で property() を実装する方法 (python) 、次のコードを実装しました:
注: この最小限のコードでは、__new__
代わりに を使用する__init__
ことは正当化されないことはわかっていますが、これは後で のサブクラスを使用するときに必要になります。Notebook
バージョン 1: 1. を使用すると、印刷される代わりに、5
and20
が印刷され20
ます20
。理由がわかりません。関数を印刷すると、アドレスが異なる関数の配列が表示されます。2.__class__
上記のブログ エントリに触発されて使用しましたが、それが何をするのかわかりません。プロパティをクラスプロパティにしますか?(私の場合、これは本当に悪いことです)
バージョン 2 を使用する場合: のようなものを出力しますproperty object at 0x7fb86a9d9b50
。これは理にかなっているように思えますが、バージョン 1 で同じものが出力されない理由がよくわかりません。
いずれかのバージョン (または別の完全に異なるアプローチ) を使用して、これを修正する方法はありますか?
編集
問題を解決するための興味深い答えが提案されました。ここに対応するコード:
問題は次のとおりです。現在、このテストコードは目的の出力を提供していません:
プロパティがクラスに追加されたので、これは予想されていたことだと思います.... とにかく、この問題を克服するには?
python - djangoモデルでsetattrを使用せずに取得するsetattrを使用してエラーを取得する方法はありますか?
私が使用する場合
それ以外の
存在しない属性に関連するエラーは発生しません。setattr を使用してそのエラーを取得する方法はありますか?
ありがとうございました。
python - クラス内のオブジェクトが不変であることを保証する __setattr__ メソッド
私は次のクラスを定義しています(その大部分は短縮されています)が、私の主な質問は、このクラスのオブジェクトが初期化された変数で定義されたら、これらの変数がクラスの外部から変更できないことを確認したいということです...このような試みが行われた場合は、AssertionError を発生させる必要があります。この例外を発生させるように定義されたsetattrメソッドがありますが、このメソッドを配置した後、このクラスで行ってきた以前のインスタンスとテストが完全に破棄され、この同じ AssertionError が常に発生します。このクラスのオブジェクトを作成しようとする試みが行われました...だから、ここに私のクラスの劇的に縮小されたバージョンがあります。
他のすべてのクラス メソッド...
したがって、このクラスからミューティング オブジェクトをテストしようとすると、このクラスの残りのメソッドで以前のテストを破棄することに加えて、間違った例外が発生します。
python - Cython が setattr を使用できない
cython に cdef クラスがあり、そのフィールドを setattr 組み込み関数で初期化したいと考えています。ただし、それを行うと、実行エラーが発生しました:
私のコードは次のとおりです。
この問題を回避する方法について何か考えがありますか?