3

ボーグのようなクラスを作ろうとしています。特定の 1 つのプロパティをすべてのインスタンスで共有したいのですが、他のプロパティはそのインスタンスに固有のものにしたいと考えています。これが私がこれまでに持っているものです:

class SharedFacility:
  _facility = None

  def __init__(self):
    entries = {'facility': self._facility}
    self.__dict__.update(entries) 

  def _getfacility(self):
    return self._facility

  def _setfacility(self, value):
    self._facility = value

  facility = property(_getfacility, _setfacility)


class Warning(SharedFacility):
  def __init__(self, warnlevel, warntext):
    SharedFacility.__init__(self)
    print "Warning.__init__()"
    self.warntext = warntext
    self.warnlevel = warnlevel

  def __call__(self):
    self.facility(self.warnlevel, self.warntext)


def functionOne(a,b):
  print 'functionOne: a=%s, b=%s' % (a,b)

def functionTwo(a,b):
  print 'functionTwo: a=%s, b=%s' % (a,b)

####################################################
w1 = Warning(1, 'something bad happened')
w1.facility = functionOne
w2 = Warning(5, 'something else bad happened')
import pdb; pdb.set_trace()

if w1.facility is w2.facility:
  print "They match!"

w1() # functionOne: a=1, b='something bad happened'
w2() # functionOne: a=5, b='something else bad happened'

w2.facility = functionTwo
if w1.facility is w2.facility:
  print "They match!"

w1() # functionTwo: a=1, b='something bad happened'
w2() # functionTwo: a=5, b='something else bad happened'

上記のコードは機能しません。w1.facility と w2.facility を同じオブジェクトへの参照にしたいのですが、w1.warntext と w2.warntext は 2 つの異なる値になります。私はpython 2.4.3で作業しています(できないのでアップグレードすることに言及しても意味がありません)。

解決策:

class Warning(object):
  _facility = None

  def __init__(self, warnlevel, warntext):
    print "Warning.__init__()"
    self._warntext = warntext
    self._warnlevel = warnlevel

  def __call__(self):
    Warning._facility(self._warnlevel, self._warntext)

  def _getfacility(self):
    return Warning._facility

  def _setfacility(self, value):
    Warning._facility = value

  facility = property(_getfacility, _setfacility)

@staticmethod
def functionOne(a,b):
  print 'functionOne: a=%s, b=%s' % (a,b)

@staticmethod
def functionTwo(a,b):
  print 'functionTwo: a=%s, b=%s' % (a,b)
4

1 に答える 1

6

これが私がすることです:

class BorgLike:
    _shared = 'default'
    def __init__(self, unique):
        self.unique = unique
    @property
    def shared(self):
        return BorgLike._shared
    @shared.setter
    def shared(self, value):
        BorgLike._shared = value

この例を自分の目的に使用する方法を知っていただければ幸いです。あなたがコードで何を望んでいるのかよくわからなかったので、推測を控えて最小限の例を書きました。

于 2012-04-25T21:07:56.233 に答える