77

使用ではなく、使い方の基本を説明してくれる人を探していますsetattr()

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

まったく同じ問題ではありませんが、Python The Hard Way、ex42whileループ@行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、@ChrisMorganご協力いただきありがとうございます。

自分の答えを説明できるようになったと思います!これには、私にとっての対象としての自己のより良い把握が必要でした。これは、属性などでタグ付けされるインスタンス名です。

クラスは町である可能性があります。 getattrその名前を使って家を探すので、すぐに電話をかける準備ができています。家が見つからない場合は別の場所を考え出します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)
4

6 に答える 6

95

Pythonのドキュメントには、私が見る限り、言う必要があることはすべて書かれています。

setattrオブジェクト名前

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

これだけでは不十分な場合は、わからないことを説明してください。

于 2012-03-05T03:15:31.353 に答える
80

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

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

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

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

value_returned = self.get_thing()
于 2012-03-05T03:14:12.690 に答える
14

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)
于 2017-03-08T10:29:48.107 に答える
5

他の答えに追加するために、私が見つけた一般的なユースケースは、構成を使用する場合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キーはクラスオブジェクト名になるため、文字列である必要があることに注意してください。

于 2019-05-20T14:23:15.653 に答える
4

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

class Example:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)
于 2017-08-26T18:31:06.387 に答える
1

あなたのコードについて私が最初に気付くのは、startをの値に設定することですsetattr

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)

の戻り値setattrはNoneです。これは、実行されてタスクを実行する操作ですが、値を返しません。のようなものを呼び出すのと同様exit()に、操作は実行されます。シェルからPythonを入力すると、次のように表示されます。

a = exit() #exits your program

print('x')をexitのように実行し、のように実行するように設定しますsetattr。ただし、aを呼び出すと、メソッドは呼び出されません。

a = print('15') #returns 15
a #returns None

setattrクラス内から呼び出すことができるようにしたい場合は、そのメソッドを定義できます。

def setAtrrClassInstance(self,name,value):  #This returns None
    setattr(self,name,value)
于 2021-09-03T16:03:35.953 に答える