这就是它的作用:类的第一个实例(在本例中为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()
答案 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已经有一段时间了。但这个想法很有希望清楚。欢迎改进。