問題タブ [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 - python3 クラスで __setattr__ + __slots__ を使用する
私は、カスタム クラス階層でのサブ要素属性へのアクセスにすべて気を配ろうとしています。私の空想は、これを行うために記述子をうまく使用できるという点で機能します。私はさらに凝って、スペースを節約するためにスロットRefHolder
を使用するクラス (以下のテストケースに表示)を作成したいと考えています。
ただし、スロットを使用しようとすると、RuntimeError: maximum recursion depth exceeded
私はすでにこれに対する既存の解決策を調べてみたことに注意してください.最もよく一致するのはこれです:
https://stackoverflow.com/a/19566973/1671693
以下のテストケースでこれを試しましたが、まだランタイム エラーが発生します。
テストケースで、コメント行がその直下の行の代わりに使用され、__slots__
から削除されたRefHolder
場合、テストケースはパスすることに注意してください。
助言がありますか?さらに、コストがかかると思われるすべての属性アクセスに対してオブジェクトを作成していますが、同じ動作を実現するより効率的な方法について何か提案はありますか? ありがとう!
python - UI 要素で setattr() を使用する
UI 要素 (QLineEdit) で setattr を使用して、テキスト ファイルから読み取った内容を入力しようとしています。QlineEdit を設定するには、self.lineEdit.setText()になると思います
私が読んでいるテキスト ファイルは、名前とその値で構成されています。
名前1=値1
splitLine[0] は「Name1」で構成され、splitLine[1] は「Value1」です。self.Name1 は、変更する lineEdit の名前であるため、eval() を使用して実際の値「Name1」を setattr に渡しました。
値を設定する方法がわかりません。今、私はこれらを試しましたが成功しませんでした:
また、次を使用します。
実際のオブジェクトは、値ではなく splitLine と呼ばれていると考えているため、機能しません (したがって、 eval() を試した理由)。
python-3.x - スーパーがサブクラスで __setattr__ を制御できるようにする
この質問は、に基づくオブジェクトの読み取り専用の問題と、スーパーがサブクラスsuper()
を制御できるかどうか/どのように制御する必要があるかについてです。__setattr__
環境:
属性を含むクラスのサブクラスであるすべてのクラスがgetattr が「set_」で始まるサブクラス化された関数を実行できないように、メタクラスまたは記述子を作成する方法はありますか?self.read_only = True
self.read_only = False
私は次のオーバーライドを考えていますobject.__setattr__(self, name, value)
:
属性の割り当てが試行されたときに呼び出されます。これは、通常のメカニズムの代わりに呼び出されます (つまり、値をインスタンス ディクショナリに格納します)。name は属性名、value はそれに割り当てられる値です。
...正しい方向ですが、ドキュメントの私の解釈が正しいかどうかは疑問です。
例:
システム設計者が意図したとおりのスーパー:
すべての結果の理解が限られているシステム拡張者によって作成されたサブ:
例への解説
システム エクステンダーではMutableMessage
、read_only が False であることを明示的に宣言し、関数を追加した結果を意識的に認識していますset_topic
。
(以下のImmutableMessage
) では、システム拡張機能はメッセージが read_only=False
であるべきであることを宣言するのを忘れています。これはsuper
s __setattr__
to になりraise AttributeError
ます:
中心的な質問: 以下の例に示す使用法は、BaseMessage クラスに基づくすべてのクラスに一貫して適用するのに十分でしょうか?
私をメタプログラミングの初心者だと考えてください。したがって、私の例の誤解および/または拡張および修正の説明は最高です。私は階層を理解しています [1]が、継承プロセス中に python がカーテンの後ろで何をしているのかについての洞察はありません。
ありがとう...
[1]: ヒエラルキー
Python が属性に使用する検索順序は次のようになります。
__getattribute__
と__setattr__
- プロパティなどのデータ記述子
- オブジェクトのインスタンス変数
__dict__
- 非データ記述子 (メソッドなど) およびその他のクラス変数
__getattr__
が最初に並んでいるので
__setattr__
、クラスのすべての属性設定を処理したくない場合を除き、スマートにする必要があります。2 つの方法のいずれかでスマートにすることができます。を。特定のセット属性のみを処理するようにする、または、
b. 一部の属性セットを除くすべてを処理できるようにします。
処理したくないものについては、 を呼び出します
super().__setattr__
。
関連する質問:
python - Python setattr と __setattr__ UnicodeEncodeError
setattr
オブジェクトの外にいるときは、メソッドを使用する必要があることを知っています。setattr
ただし、ユニコードキーで呼び出すのに問題があり、__setattr__
直接使用する必要があります。
そして、次のコンテンツを取得しますobj.properties
:
setattr(obj, u"é", u"à")
: UnicodeEncodeError を発生させますsetattr(obj, "é", u"à")
:{'\xc3\xa9': u'\xe0'}
obj.__setattr__(u"é", u"à")
:{u'\xe9': u'\xe0'}
なぜPythonがこれらの違いで動作しているのか理解できません
python - setattr がクラスに追加されたメソッドに self を渡さない
私はクラスを持っています:
メソッドを動的に追加したいのですが、入力に基づいて名前を付けたいです(私の場合は、コード化されたオブジェクトの属性に基づいていますが、それは重要ではありません)。したがって、以下を使用してメソッドを追加しています。
これはすべて正常に機能しますが、1 つの注意点があります。
インスタンスが自分自身を新しい関数に渡さないのはなぜですか?