デバッグが容易ではない方法でオブジェクトの状態が変化するのを避けるために、ここでいくつかの防御的なプログラミングを行おうとしています。Pythonで次のことが可能であるとすると、Foo.nameが変更されないように保護して強制する方法があります。もっとはっきりとやるの?
class A(object):
def __init__(self, foo):
self.foo = foo
class B(object):
def __init__(self, foo):
self.foo = foo
def rename(self, new_name):
self.foo.name = new_name
class Foo(object):
def __init__(self, name):
self.name = name
if __name__ == '__main__':
foo = Foo('Fooname')
print 'A foo instance is born and baptized as %s' % foo.name
ainstance = A(foo)
print 'The foo instance is then passed to A and is still called %s' % foo.name
binstance = B(foo)
print 'But then the foo instance is passed to B'
binstance.foo.name = 'Barname'
print 'And in B it is renamed to %s' % foo.name
これは以下を出力します:
A foo instance is born and baptized as Fooname
The foo instance is then passed to A and is still called Fooname
But then the foo instance is passed to B
And in B it is renamed to Barname
Fooの名前を変更するメソッドを実装して、自分で強制的に使用したり、名前マングリングを使用したりできることはわかっていますが、それでも、foo.name
呼び出されても不注意に変更されるのを防ぐことはできません。foo._name