web-dev-qa-db-ja.com

pythonでsetattr()を使用する

setattr()を使用せず、使用方法の基本を説明してくれる人を探しています。

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

同じ問題ではありませんが、私は Python The Hard Way、ex42 —_while loop @ lines 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 a 'name' exists 、あなたはそれを見つけに行きます。ある機能から別の機能へのステップを動的にするボーナスとして、フォールバックのデフォルトメソッドを取得するのに便利なデフォルト値がある場合があります。接続に失敗したなどです。

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)
54
bounce

関数self.nameではなく、"get_thing"stringget_thingに設定しています。

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

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

ただし、他のコードでは直接呼び出す必要があるため、これは完全に不要です。

value_returned = self.get_thing()
64
Amber

Python docs は、私が見る限り、言う必要があることすべてを言っています。

setattrobjectnamevalue

これは getattr() に相当します。引数は、オブジェクト、文字列、および任意の値です。文字列は、既存の属性または新しい属性を指定できます。この関数は、オブジェクトで許可されている場合、値を属性に割り当てます。たとえば、setattr(x, 'foobar', 123)x.foobar = 123と同等です。

これで十分でない場合は、理解できないことを説明してください。

74
Chris Morgan

Setattr:クラスインスタンスに属性を追加するためにsetattrを使用します。クラスインスタンス、属性名、および値を渡します。そしてgetattrでこれらの値を取得します

例えば

Employee = type("Employee", (object,), dict())

employee = Employee()

# Set salary to 1000
setattr(employee,"salary", 1000 )

# Get the Salary
value = getattr(employee, "salary")

print(value)
11
kuldeep Mishra

以前はコードで記述されていなかったインスタンスに属性を与えたいとします。 setattr()はまさにそれを行います。クラスselfのインスタンスと、設定するキーと値を取ります。

class Example:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)
4
Amar Bir Singh

他の答えに追加するために、setattr()の一般的な使用例は、構成を使用する場合です。ファイル(.iniファイルなど)の構成を辞書に解析するのが一般的です。したがって、次のような結果になります。

configs = {'memory': 2.5, 'colour': 'red', 'charge': 0, ... }

その後、これらの構成をクラスに割り当てて保存し、渡したい場合は、簡単な割り当てを行うことができます。

MyClass.memory = configs['memory']
MyClass.colour = configs['colour']
MyClass.charge = configs['charge']
...

ただし、構成をループ処理する方がはるかに簡単で冗長ではないため、setattr()は次のようになります。

for name, val in configs.items():
    setattr(MyClass, name, val)

辞書のキーに適切な名前がある限り、これは非常にうまく機能し、きちんと整理されています。

*注、dictキーはクラスオブジェクト名になるため、文字列にする必要があります。

0
HoboProber