Класс, который позволяет мне заполнять только экземпляры первого созданного типа - PullRequest
1 голос
/ 30 августа 2011

Вот что он делает: содержимое первого экземпляра класса (в данном случае mok1) заполняется водой. Я могу заполнить его бесконечно, но как только будет создан первый экземпляр, я смогу заполнить только этот экземпляр и выдать ошибку любому другому экземпляру. Есть ли более чистый и лучший способ сделать это? Теперь я использую разницу в классе var и var экземпляра, что сбивает с толку людей, потому что это разные переменные. Спасибо ребята;)

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 голосов
/ 04 сентября 2011

С точки зрения Java это можно решить с помощью шаблона Factory.

У вас будет 2 класса Mok, которые не могут быть заполнены, и FillableMok, который наследует Mok (и, следовательно, является Mok), который может быть заполнен. Фабрика выпускает только один FillableMok (по сути, синглтон), все остальные по умолчанию являются незаполняемыми Моксами.

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 голосов
/ 30 августа 2011

Почему ты это делаешь?Попробуйте:

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!

Я в замешательстве ...

0 голосов
/ 31 августа 2011

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

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 голосов
/ 30 августа 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...