read
およびwrite
メソッドを含むクラスを定義します。これらは次のように呼び出すことができます。
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__
などを呼び出します。このコードを変更するにはどうすればよいですか?この場合、x
の新しい属性self
が作成され、値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
または、__setattr__()
内からself.__dict__
を変更できます。
class SomeClass(object):
def __setattr__(self, name, value):
print(name, value)
self.__dict__[name] = value
def __init__(self, attr1, attr2):
self.attr1 = attr1
self.attr2 = attr2
sc = SomeClass(attr1=1, attr2=2)
sc.attr1 = 3
objectを使用することもできます。
class TestClass:
def __init__(self):
self.data = 'data'
def __setattr__(self, name, value):
print("Attempt to edit the attribute %s" %(name))
object.__setattr__(self, name, value)
または、単に@propertyを使用できます。
class MyTest(object):
def __init__(self, x):
self.x = x
@property
def device(self):
return self