Класс, который позволяет мне заполнять только экземпляры первого созданного типа

1

Это то, что он делает: содержимое первого экземпляра класса (в данном случае 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()
  • 10
    Почему? Просто почему??
  • 1
    Я не могу понять, что вы пытаетесь сделать или почему вы хотели бы это сделать.
Показать ещё 1 комментарий
Теги:
class
state
variables
instance

4 ответа

0

С точки зрения 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. Но идея, надеюсь, очевидна. Усовершенствования приветствуются.

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!')
  • 0
    Это выглядит великолепно, но не работает: S
  • 0
    Правильно, исправлено!
Показать ещё 2 комментария
0

Я думаю, что вопрос связан с тем, как эффективно реализовать Синглтон. Хотя вы, видимо, хотите разрешить несколько экземпляров (следовательно, у вас нет Singleton), вам все равно нужно определить этот первый экземпляр.

Проблема с вашим решением заключается в том, что вы не идентифицируете первый экземпляр, а первый экземпляр, на который вы назвали Fill().

Вам нужно установить переменную класса в конструкторе. Возможно, эта отличная статья в Википедии содержит некоторые дополнительные идеи.

  • 0
    Нет, я не должен использовать синглтон. Если я установлю переменную в конструкторе, пользователь сможет манипулировать работой программы. Я должен что-то изменить в классе.
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!

Я смущен...

  • 1
    Как class mok(): лучше, чем class mok:
  • 0
    Я предпочитаю единый синтаксис. Я предпочитаю всегда использовать один и тот же class <name>([<parents>]): <body> синтаксиса class <name>([<parents>]): <body>
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню