1. ホーム
  2. python

[解決済み] setattr__ の正しい使い方、無限再帰を回避する方法

2022-02-17 15:37:11

質問

を含むクラスを定義したい。 readwrite メソッドがあり、以下のように呼び出すことができます。

instance.read
instance.write
instance.device.read
instance.device.write

インターレースされたクラスを使用しないために、私のアイディアは __getattr____setattr__ メソッドを実行し、与えられた名前が device にリダイレクトします。 self . しかし、無限回の再帰を与える問題に遭遇しました。コード例は以下の通りです。

class MyTest(object):
    def __init__(self, x):
        self.x = x

    def __setattr__(self, name, value):
        if name=="device":
            print "device test"
        else:
            setattr(self, name, value)

test = MyTest(1)

のように __init__ は、新しい属性を作成しようとしました。 x を呼び出すと __setattr__ を呼び出し、それがまた __setattr__ といった具合です。このコードをどのように変更する必要があるかというと、この場合、新しい属性である xself が作成され、値 1 ?

または、次のような呼び出しを処理する良い方法はありますか? instance.device.read に「マップ」されます。 instance.read ?

常に「なぜ」という疑問があるように。を抽象化する必要があります。 xmlrpc のような非常に簡単なメソッドを呼び出すことができます。 myxmlrpc.instance,device.read などを作成することができます。このようなマルチドットメソッドの呼び出しを模倣するために、これを「モック」する必要があります。

どのように解決するのですか?

親クラスを呼び出す必要があります。 __setattr__ メソッドを使用します。

class MyTest(object):

    def __init__(self, x):
        self.x = x

    def __setattr__(self, name, value):
        if name=="device":
            print "device test"
        else:
            super(MyTest, self).__setattr__(name, value)
            # in python3+ you can omit the arguments to super:
            #super().__setattr__(name, value)

ベストプラクティスの件ですが、これを経由して使う予定なので xml-rpc の中で行うのが良いかと思います。 _dispatch メソッドを使用します。

手っ取り早いのは、単純に実行することです。

class My(object):
    def __init__(self):
        self.device = self