Это то, что он делает: содержимое первого экземпляра класса (в данном случае mok1) заполняется водой. Я могу заполнить его бесконечно, но как только будет создан первый экземпляр, я могу только заполнить этот экземпляр и сгенерировать ошибку любым другим экземпляром. Есть ли более чистый и лучший способ сделать это? Теперь я использую разницу в классе var и экземпляре var, который запутывает людей, потому что это разные переменные. Thnx guys;)
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()
С точки зрения Java это можно решить с помощью шаблона Factory.
У вас будет 2 класса Mok, которые не могут быть заполнены, и FillableMok, который наследует Mok (и, следовательно, is-a 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. Но идея, надеюсь, очевидна. Усовершенствования приветствуются.
Итак, вы хотите класс, который позволяет только заполнить экземпляры первого типа?
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!')
Я думаю, что вопрос связан с тем, как эффективно реализовать Синглтон. Хотя вы, видимо, хотите разрешить несколько экземпляров (следовательно, у вас нет Singleton), вам все равно нужно определить этот первый экземпляр.
Проблема с вашим решением заключается в том, что вы не идентифицируете первый экземпляр, а первый экземпляр, на который вы назвали Fill().
Вам нужно установить переменную класса в конструкторе. Возможно, эта отличная статья в Википедии содержит некоторые дополнительные идеи.
Почему вы это делаете? Пытаться:
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!
Я смущен...
class mok():
лучше, чем class mok:
class <name>([<parents>]): <body>
синтаксиса class <name>([<parents>]): <body>