問題タブ [getattr]
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 を難しい方法で学ぶ: 演習 43 関数の作成
私の質問は、 Learn Python The Hard Way - Exercise 43にある上記のコード ブロックから生じています。getattr()
3 行目で関数の結果 (この場合はself.next
) が変数に格納されていることは理解していroom
ます (間違っていなければ...?)。
今私を悩ませているのは、関数room()
が variable に格納されている 4 行目ですnext
。room()
基本的に、これはコードブロックで定義された関数ではないため、その部分がわかりません。Python では、ユーザーは前の変数に基づいて関数を定義できますか? room()
(例:初めて書き込むとroom()
、変数に格納されている内容に基づいて呼び出される関数が作成されますroom
)。
どんな助けでも大歓迎です!
python - 引数は__getattr__を介して関数にどのように渡されますか
次のコード例(python 2.7)について考えてみます。
関数呼び出しがperson.make_statement(20)
のChild.make_statement
関数を介して関数を呼び出すことを示すことができます。関数では、子インスタンスの対応する関数が呼び出される前に、属性を出力できます。これまでのところ明確です。Parent
__getattr__
__getattr__
しかし、呼び出しの引数はどのようにperson.make_statement(20)
渡され__getattr__
ますか?関数で数値「20」を出力するにはどうすればよいです__getattr__
か?
python - __getattr__ を使用して呼び出しパラメーターと引数にアクセスする方法
私は次のコードを持っています。ほとんどのコードはぎこちなく、紛らわしく、状況に応じて見えるように見えますが、そのほとんどは、私が問題を抱えているはるかに大きなコードの部分を示すためのものです。注意深く読んでください
私が望むのは、すべてのメソッド呼び出しをキャッチして、DeviceProxy
すべての引数/パラメーターなどを出力できるようにすることです。与えられた例では、これは を呼び出すときにうまく機能しinfo(1)
、すべての情報が出力されます。しかし、二重点の関数を呼び出すと、dev.obj.foo(3)
これは呼び出し可能ではないというメッセージしか表示されません。
上記のコードを変更して、2 番目のケースでも情報を取得するにはどうすればよいですか? 以下のコードのみ===
変更できます。
python - `setattr` (および `getattr`) の使用は悪い習慣と見なすことができますか?
setattr
そしてgetattr
、私のプログラミングスタイルに入りました(主に科学的なもので、Pythonに関する私の知識は独学です)。
場合によってはセキュリティ上の問題につながる可能性があるため、潜在的な危険を継承することを考慮するexec
と、同じ議論が有効であると見なされるかどうか疑問に思っていました. (私はいくつかの情報を含むこの質問を見つけました-議論はあまり説得力がありませんが。)eval
setattr
getattr
私の知る限り、setattr
あまり気にせずに使用できますが、正直なところ、Python の知識を十分に信頼していません。間違っている場合は、使用する習慣を取り除きたいと思います。setattr
.
どんな入力でも大歓迎です!
python - getattr()とdictルックアップのどちらが速いですか?
ややお粗末な、ベストプラクティスの質問。object.__dict__[some_key]
習慣として使用して、オブジェクトの属性値を動的に検索します。今、私はどちらがより良い/より速いのか疑問に思っています:私の現在の習慣またはgetattr(object,some_key)
。1つが優れている場合、なぜですか?
python - getattr throwingでアクセスされるバインドされたPythonメソッド: "引数を取りません(1つ指定)"
バインドされたメソッド、継承、およびgetattrの間の相互作用で、私が理解できていない奇妙なことが起こっています。
私は次のようなディレクトリ設定をしています:
import_module.pyには、次の形式のクラスオブジェクトがいくつか含まれています。
start_module.pyの関数は、inspectを使用して、imported_module.pyのクラスを表す文字列のリストを取得します。「Foo」はそれらの文字列の最初のものです。目標は、その文字列とgetattrを使用してstart_module.pyでbarを実行することです。*
これを行うには、次の形式のstart_moduleのコードを使用します。
これはリスト内包表記の反復を正常に開始しますが、最初の文字列「bar」で奇妙なエラーが発生します。バーはバインドされたメソッドですが、Fooのインスタンスを引数として期待していることを理解している限り、次のように言われます。
TypeError:bar()は引数を取りません(1つ指定)
これにより、function()の呼び出しがFooインスタンスを渡しているように見えますが、コードはそれを受け取ることを期待していません。
私はここで何が起こっているのか本当にわかりませんし、GoogleとStackOverflowを見て説明を解析することもできませんでした。ダブルgetattrは奇妙な相互作用を引き起こしていますか?Pythonのクラスオブジェクトについての私の理解はあまりにも曖昧ですか?私はあなたの考えを聞いてみたいです。
*アンチパターンを回避するための実際の最終目的は、start_module.pyがimported_module.pyのFooと同様のさまざまなクラスの名前バーのすべてのメソッドに自動的にアクセスできるようにすることです。私は、後継者がFooに似たクラスの数が非常に多い可能性があるもののリストを維持することを回避することを期待してこれを行っています。
以下の回答:ここでの最大のポイントは、検査が非常に役立つことです。発生しているバグの一般的な原因がある場合は、他の可能性を探す前に、それを除外したことを絶対に確認してください。この場合、ファイル構造が最近編集されたために、正しいコードを持っているモジュールがインポートされていない可能性があるという事実を見落としていました。
python - Python で任意のオブジェクトの二重下線 (マジック) メソッドをオーバーライドする方法はありますか?
「理由」属性を追加することを除いて、値を取り、それと同じように動作するラッパー クラスを作成したいと考えています。私は次のようなことを念頭に置いていました:
__getattribute__
ただし、二重アンダースコア関数は、たとえば次のようにキャプチャされていないようです。
上記の2つは最終的にこれを行うべきだと思います:
なぜこれが起こらないのですか?どうすれば実現できますか?(これを実際のコードで実際に使用するのは恐ろしい考えかもしれませんが、今は技術的な問題に興味があります。)
python - __getattr__関数を使用してPythonクラスにないプロパティと関数の両方を処理して返す方法は?
Pythonクラスで特別なメソッドを使用して、欠落しているプロパティまたは関数のいずれかを処理するのはかなり簡単ですが__getattr__
、両方を同時に処理することはできないようです。
クラスの他の場所で明示的に定義されていない、要求されたプロパティを処理するこの例を考えてみましょう。
次に、クラスの他の場所で明示的に定義されていない関数呼び出しを処理するこの例を検討してください。
問題は、両方のタイプの欠落している属性を同じものでどのように処理する__getattr__
かです。要求された属性がプロパティ表記であるか、括弧付きのメソッド表記であるかを検出し、それぞれ値または関数を返す方法は?基本的に、いくつかの欠落しているプロパティ属性といくつかの欠落している関数属性を処理してから、他のすべての場合はデフォルトの動作に頼りたいと思います。
助言?
python - 継承を使用してさまざまな権限をスマートに処理する
アクセス許可を管理する必要があり、たとえばここにあるカップルのように、さまざまなユーザー タイプがあります。
ここで、MultiRole タイプを使用できるようにしたいと考えています。これは、理論的には、ロールが実行できるすべてのことを単純に実行できるはずです。
私はこのようなもので試しました:
として使用する必要があります
理想的には、渡されたすべてのクラスのメソッドを呼び出して、or (with any) を実行したいと考えています。
問題は、そのタイプのオブジェクトが必要なメソッドを呼び出すことです..
理論的には、代わりに各ロールに辞書を使用することもできますが、デフォルトの偽のトリックが好きで、パーミッションを計算する関数も必要になる場合があります。
助言がありますか?
python - getattrを使用してメソッドのオブジェクト参照を取得する
言ってやるが、私は次のようにclass
呼ばれるTest
method
start
今、私はスタンドアロンの独立したfunction
と呼ばれるfunc
[1]さて、にt.start
属するのはmethod
instance of __main__.Test
0xb769678c
[2]
func
はfunction
その場所に属する0xb767ec6c
これで、組み込みのを使用して__module__
からt.start
を抽出できます。当然のことながら、同じすなわちに属しますfunc
__module__
func
t.start
module
__main__
[3]では、変数に格納__module__
しましょうt.start
obj
ここで、次のように関数のハンドルgetattr()
を取得するために使用します。の出力はto[2]です。func
<function func at 0xb767ec6c>
func
getattr()
identical
質問:
getattr()
モジュール名[3]を使用して、 Test.start
[1]のハンドルを取得するにはどうすればよいですか。<bound method Test.start of <__main__.Test instance at 0xb769678c>>
getattr()
使ってみると't.start'
次のようになりましたTraceback
つまり、2つのデータがあります。彼らです
__import__('__main__')
- 刺す
'Test.start'
さて、どうすればt.start
(ここに注意してinstance
ください)のハンドルを取得できますか?<bound method Test.start of <__main__.Test instance at 0xb769678c>>