3

知らないうちにオブジェクトをバージョン管理したいのですが。

このようなもの:

class Versioned(object):
   ...
   def version(self):
       ...

class Foo(Versioned):

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

foo = Foo(123)
assert foo.version() == 1

foo.a = 1
foo.a = 2
foo.a = 3

assert foo.version() == 4

これを行う簡単な方法はありますか?

4

3 に答える 3

2

クイックハック:

class Versioned(object):
    version = 0

    def __init__(self):
        self.version = 0

    def _increaseVersion(self):
        super(Versioned, self).__setattr__('version', self.version+1)

    def __setattr__(self, attr, value):
        super(Versioned, self).__setattr__(attr, value)
        self._increaseVersion()

    def __delattr__(self, attr):
        super(Versioned, self).__delattr__(attr)
        self._increaseVersion()


class Foo(Versioned):
    def __init__(self, a):
        self.a = a
        super(Foo, self).__init__()


foo = Foo(123)
print 'value:', foo.a
print 'version:', foo.version
foo.a = 23
print 'value:', foo.a
print 'version:', foo.version
del foo.a
print hasattr(foo, 'a')
print 'version:', foo.version

出力:

value: 123
version: 1
value: 23
version: 2
False
version: 3
于 2012-10-26T12:12:35.493 に答える
1
class Versioned(object):
    def __init__(self):
        self.version = 0
    def __setattr__(self, name, value):
        if name == 'version':
            object.__setattr__(self, 'version', value)
        else:
            object.__setattr__(self, name, value)
            object.__setattr__(self, 'version', self.version +1)

例:

class Foo(Versioned):
    pass

f = Foo()
print f.version  # prints 0

f.a = 1
print f.version # prints 1

f.b = 3
print f.version # prints 2

f.b = 33
print f.version # prints 3
于 2012-10-26T12:11:18.250 に答える
0

https://github.com/swisscom/cleanerversionをご覧ください。私があなたの要件を正しく理解していれば、まさにあなたが探しているものを実行できます。

ある程度永続的なソリューションが必要だったので、モジュールは Django で構築されます。これにより、これらのオブジェクトを Django がサポートするリレーショナル DB に書き込むことができます。

于 2014-09-09T11:59:36.543 に答える