問題タブ [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.

0 投票する
0 に答える
435 参照

python - python3 クラスで __setattr__ + __slots__ を使用する

私は、カスタム クラス階層でのサブ要素属性へのアクセスにすべて気を配ろうとしています。私の空想は、これを行うために記述子をうまく使用できるという点で機能します。私はさらに凝って、スペースを節約するためにスロットRefHolderを使用するクラス (以下のテストケースに表示)を作成したいと考えています。

ただし、スロットを使用しようとすると、RuntimeError: maximum recursion depth exceeded

私はすでにこれに対する既存の解​​決策を調べてみたことに注意してください.最もよく一致するのはこれです:

https://stackoverflow.com/a/19566973/1671693

以下のテストケースでこれを試しましたが、まだランタイム エラーが発生します。

テストケースで、コメント行がその直下の行の代わりに使用され、__slots__から削除されたRefHolder場合、テストケースはパスすることに注意してください。

助言がありますか?さらに、コストがかかると思われるすべての属性アクセスに対してオブジェクトを作成していますが、同じ動作を実現するより効率的な方法について何か提案はありますか? ありがとう!

0 投票する
2 に答える
554 参照

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() を試した理由)。

0 投票する
1 に答える
1338 参照

python-3.x - スーパーがサブクラスで __setattr__ を制御できるようにする

この質問は、に基づくオブジェクトの読み取り専用の問題と、スーパーがサブクラスsuper()を制御できるかどうか/どのように制御する必要があるかについてです。__setattr__

環境:

属性を含むクラスのサブクラスであるすべてのクラスがgetattr が「set_」で始まるサブクラス化された関数を実行できないように、メタクラスまたは記述子を作成する方法はありますか?self.read_only = Trueself.read_only = False

私は次のオーバーライドを考えていますobject.__setattr__(self, name, value):

属性の割り当てが試行されたときに呼び出されます。これは、通常のメカニズムの代わりに呼び出されます (つまり、値をインスタンス ディクショナリに格納します)。name は属性名、value はそれに割り当てられる値です。

...正しい方向ですが、ドキュメントの私の解釈が正しいかどうかは疑問です。

例:

システム設計者が意図したとおりのスーパー:

すべての結果の理解が限られているシステム拡張者によって作成されたサブ:

例への解説

システム エクステンダーではMutableMessage、read_only が False であることを明示的に宣言し、関数を追加した結果を意識的に認識していますset_topic

(以下のImmutableMessage) では、システム拡張機能はメッセージが read_only=Falseであるべきであることを宣言するのを忘れています。これはsupers __setattr__to になりraise AttributeErrorます:

中心的な質問: 以下の例に示す使用法は、BaseMessage クラスに基づくすべてのクラスに一貫して適用するのに十分でしょうか?

私をメタプログラミングの初心者だと考えてください。したがって、私の例の誤解および/または拡張および修正の説明は最高です。私は階層を理解しています [1]が、継承プロセス中に python がカーテンの後ろで何をしているのかについての洞察はありません。

ありがとう...

[1]: ヒエラルキー

Python が属性に使用する検索順序は次のようになります。

  1. __getattribute____setattr__
  2. プロパティなどのデータ記述子
  3. オブジェクトのインスタンス変数__dict__
  4. 非データ記述子 (メソッドなど) およびその他のクラス変数
  5. __getattr__

が最初に並んでいるので__setattr__、クラスのすべての属性設定を処理したくない場合を除き、スマートにする必要があります。2 つの方法のいずれかでスマートにすることができます。

を。特定のセット属性のみを処理するようにする、または、

b. 一部の属性セットを除くすべてを処理できるようにします。

処理したくないものについては、 を呼び出しますsuper().__setattr__

関連する質問:

0 投票する
2 に答える
877 参照

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がこれらの違いで動作しているのか理解できません

0 投票する
0 に答える
100 参照

python - setattr がクラスに追加されたメソッドに self を渡さない

私はクラスを持っています:

メソッドを動的に追加したいのですが、入力に基づいて名前を付けたいです(私の場合は、コード化されたオブジェクトの属性に基づいていますが、それは重要ではありません)。したがって、以下を使用してメソッドを追加しています。

これはすべて正常に機能しますが、1 つの注意点があります。

インスタンスが自分自身を新しい関数に渡さないのはなぜですか?