一个只允许我填充所创建的第一个类型的实例的类

时间:2011-08-30 19:30:21

标签: python class variables state instance

这就是它的作用:类的第一个实例(在本例中为mok1)的内容充满了水。我可以无限地填充它,但是一旦创建第一个实例,我只能填充该实例并由任何其他实例生成错误。有更干净,更好的方法吗?现在我使用类的var和实例的var中的差异,这对人们来说很困惑,因为它是不同的变量。 Thnx家伙;)

class mok:
    _content = 'EMPTY'
    def __init__( self flavour ):
        self.flavour = flavour

    def fill( self ):
        if mok._content == 'EMPTY':
            self._content = '1'
            mok._content = 1

        if self._content == '1':    
            print 'Filling mok!'
        else:
            print 'Error: This is a different mok!'

mok1 = mok( 'thea' )    
mok2 = mok( 'coffee' )

mok1.fill()
mok1.fill()
mok2.fill()
mok1.fill()

输出:

Filling mok!

Filling mok!

Error: This is a different mok!

Filling mok!

我找到了解决方案:

class mok:
    _mok_with_water = 0

    def __init__( self, color, flavour ):
        self.color = color
        self.flavour = flavour

    def printcolor( self ):
        print 'Mok color =', self.color
    print 'Mok flavour =', self.flavour

    def fill( self ):
    self.printcolor()
        if mok._mok_with_water == 0:
        mok._mok_with_water = self

    if mok._mok_with_water == self:
        print 'Filling mok!'
    else:
        print 'Error: This is a different mok!'

    def empty( self ):
        if self == mok._mok_with_water:
            mok._mok_with_water = 0

mok1 = mok( 'geel', 'thee' )    
mok2 = mok( 'zwart', 'koffie' )

mok1.fill()
mok1.fill()
mok2.fill()
obj = mok1.empty()
obj = mok2.fill()
obj = mok1.fill()

4 个答案:

答案 0 :(得分:0)

我认为这个问题与如何有效实施Singleton有关。虽然您显然希望允许多个实例(因此您没有Singleton),但仍需要识别第一个实例。

您的解决方案的问题在于您没有识别第一个实例,而是您调用Fill()的第一个实例。

您需要在构造函数中设置类变量。也许这个优秀的Wikipedia article提供了一些额外的想法。

答案 1 :(得分:0)

你为什么这样做?尝试:

class mok():

    def __init__(self, flavour):

        self.flavour = flavour
        self.is_empty = True

    def fill(self):

        print 'Filling mok!'
        self.is_empty = False


mok1 = mok('coffe')
mok2 = mok('tea')

mok1.fill()
mok1.fill()
mok2.fill()
mok1.fill()

输出:

Filling mok!
Filling mok!
Filling mok!
Filling mok!

我很困惑......

答案 2 :(得分:0)

所以你想要一个只允许你填充第一个类型的实例的类?

class ContentError(Exception):
    pass

class Mok(object):

    _content = None

    def __init__(self, flavour):
        self.flavour = flavour
        if Mok._content is None:
            Mok._content = flavour

    def fill(self):
        if self._content == self.flavour:
            print 'Filling!'
        else:
            raise ContentError('This is a different mok!')

答案 3 :(得分:0)

从Java的角度来看,这可以通过Factory模式解决。

你有2个Mok,无法填充,FillableMok继承Mok(因此是一个Mok)可以填充。工厂只生产一个FillableMok(基本上是一个单独的),所有其他都是默认的,不可填充的Moks。

class Mok(Object):
    def fill(self):
        raise CannotBeFilledException()

class FillabelMok(Mok):
    def fill(self):
        filled = True # or whatever

class Factory(Object):
    _fillableMok = None

    def createMok(self):
        if _fillableMok:
           return Mok()
        _fillableMok = FillableMok()
        return _fillableMok()

这可能在语法上不正确,因为我使用Python已经有一段时间了。但这个想法很有希望清楚。欢迎改进。