1. ホーム
  2. python

[解決済み] pythonでsetattr()を使用する

2022-03-02 16:41:31

質問

を使う、使わないの基本的なことを説明してくれる人を探しています。 setattr() .

私の問題は、あるクラスのメソッド/関数を使用してデータを返し、そのデータを別のメソッド/関数に入れようとしていることです。おそらくこの場合、よりシンプルなアプローチの方がずっと良いのでしょうが、私はクラスがどのように機能し、使用されるのかを理解しようとしているのです。この問題は setattr() ということで、かなりシンプルな使い方に挑戦してみました。

同じ問題とは言えないが、私は次のようなことをしていた。 Python The Hard Way, ex42 -その while のループを18-41行目で見てください。

を書いてみましたが \__init__() を使用し、さらに getattr() おそらくクラスの名前空間に何かが必要なのだろうと思い、その代わりとしたのですが、これは役に立たなかったようです。

#! /bin/python2.6

class HolyGrail(object):

    def __init__(self):
        self.start = 'start_at_init'

    # function definition in question:
    # TypeError: 'str' object is not callable

    def run_it(self):
        start = setattr(self, 'name', 'get_thing')
        start = self.name

        # Something wrong here?
        value_returned = start() #I believe this == self.get_thing()
        use_it(value_returned)

    """
    # alternate function definitions
    # NameError: global name 'start' is not defined

    def __init__(self):
        self.start = 'get_thing'

    def run_it(self):
        go_do_it = getattr(self, start)
        first_output = go_do_it()
        use_it(first_output)
    """

    def get_thing(self):
        return "The Knights Who Say ... Ni!"

    def use_it(self, x):
        print x
        print "We want a shrubbery!"

my_instance = HolyGrail()
my_instance.run_it()


Karl Knechtelさん、Amberさん、Chris Morganさん、ご協力ありがとうございました。

自分の答えを説明できるようになった!?これは、私にとってオブジェクトとしての自己をよりよく把握する必要がありました。 インスタンス名で、属性などのタグをつけるのです。

クラスはタウンでもいいし、それから。 getattr すぐに呼び出せるように、その名前を使って家を探し、家が見つからなかったら別の場所を思いつく。 --With getattr 名前」が存在し、それを探しに行く。ある機能から別の機能へのステップをダイナミックにする ボーナスとして、デフォルトの値を設定することができます。

setattr は家を建てて、後で呼び出せるように名前をつけます。 この家を建て直すこともできるし、見つからなかったら特定の場所に行くこともできる可能性があります。 -- setattr 属性名をつけ、その値を与える、または変更し、後で呼び出す。 ユーザーがサウンドをオフにした場合、以降のメソッドは音声を出力しないようにすることができます。

この関数はいろいろな書き方ができるけど、属性を変える必要はないんだ。

def run_it(self):
    yo = getattr(self, 'get_thing')
    answer = yo()
    setattr(self, 'deal_accepted', self.use_it) #really ott
    no = getattr(self, 'deal_accepted')
    no(answer)

正しく修正されたコード。

def run_it(self):
    value_returned = self.get_thing()
    self.use_it(value_returned)

解決方法は?

を設定しています。 self.name 文字列 "get_thing" ではなく、関数 get_thing .

もし、あなたが self.name を関数にする場合は、1 に設定する必要があります。

setattr(self, 'name', self.get_thing)

しかし、他のコードでは直接呼び出せばよいので、これは全く不要です。

value_returned = self.get_thing()