0

デバッグが容易ではない方法でオブジェクトの状態が変化するのを避けるために、ここでいくつかの防御的なプログラミングを行おうとしています。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

4

1 に答える 1

3

次のように、任意の属性の設定をインターセプトできます。

class Foo(object):
    def __init__(self, name):
        self.name = name

    def __setattr__(self, attrname, value):
        print "Intercepted: " + attrname + " attribute of Foo set to " + value
        super(Foo, self).__setattr__(attrname, value)

Fooこれにより、誰かがインスタンスの属性を設定するたびに通知されます。__setattr__明らかに、誰かが予期しないときに属性を設定した場合にプログラムを中止するまで、好きなことを行うことができます。

プロパティは、単一の属性に対してこれを行うための優れた方法です。

class Foo(object):
    def __init__(self, name):
        self.__name = name

    def getname(self):
        return self.__name

    def setname(self, name):
        print "Intercepted: name attribute of Foo set to " + name
        self.__name = name

    name = property(getname, setname)

ただし、__setattr__すべての属性設定を1か所からインターセプトできます。

于 2012-09-03T13:56:50.423 に答える