Управление экземплярами объекта - PullRequest
1 голос
/ 15 сентября 2009

Я хочу иметь возможность создавать и неизвестное количество объектов. Я не уверен, что есть лучший способ управлять ими и ссылаться на них.

Позволяет использовать стандартный пример ООП ... скажем, каждый раз, когда пользователь вводит имя питомца в текстовое поле и нажимает кнопку, новый объект питомца создается с помощью функции petFactory.

function pet(name)
{
       this.name= name;
}

function petFactory(textFieldInput)
{
       var x = new pet(textFieldInput)
}

Поскольку, как я знаю, нет способа (кроме функции eval) динамически использовать новое уникальное имя переменной для питомца при каждом вызове petFactory, x переназначается новому объекту, а последний питомец теряется , То, что я делал, это помещал объект pet в массив, как только он был инициализирован.

petArray.push(this);

Поэтому, если бы я хотел питомца с именем 'mrFuzzyButtoms', я мог бы перебирать индексированный массив, пока не нашел объект с переменной экземпляра 'mrFuzzyButtoms'

for (n in petArray)
{
       if (petarray[n].name == 'mrFuzzyBottoms')
       {
               // Kill mrFuzzyBottoms
       }
}

или я мог бы использовать ассоциативный массив ... как угодно ... но массив - единственный метод, который я знаю для этого. Помимо использования функции eval для создания уникальных имен переменных из строк, но в некоторых языках отсутствует функция eval (actionscript3), и тогда возникает угроза безопасности.

Есть ли лучший способ сделать это?

Редактировать : Сейчас я работаю в Python, JavaScript и ActionScript.

Ответы [ 3 ]

3 голосов
/ 15 сентября 2009

«Я мог бы использовать ассоциативный массив» Правильно.

"массив - единственный известный мне метод для этого."

Узнайте о «сопоставлениях» или «словарях» как можно скорее. Вы обнаружите, что он делает именно то, что вы просите.

Какой язык вы используете? Если вы предоставляете конкретный язык, мы можем предоставить конкретные ссылки на структуру «Карта» на этом языке.

2 голосов
/ 15 сентября 2009

Это то, для чего предназначены классы коллекций (списки, словари / карты, наборы); собрать несколько экземпляров. В приведенном выше случае я бы, вероятно, использовал карту (имя класса зависит от языка) от имени к объекту.

0 голосов
/ 16 сентября 2009
#!/usr/bin/env python
"""Playing with pets.    

"""


class Pet(object):
    """A pet with a name."""
    def __init__(self, name):
        """Create a pet with a `name`.

        """
        self._name = name

    @property
    def name(self): # name is read-only
        return self._name

    def __repr__(self):
        """
        >>> eval(repr(self)) == self
        """
        klass = self.__class__.__name__
        return "%s('%s')" % (klass, self.name.replace("'", r"\'"))

    def __eq__(self, other):
        return repr(self) == repr(other)

    name2pet = {} # combined register of all pets

    @classmethod
    def get(cls, name):
        """Return a pet with `name`.

        Try to get the pet registered by `name` 
        otherwise register a new pet and return it
        """
        register = cls.name2pet
        try: return register[name]
        except KeyError:
            pet = register[name] = cls(name) # no duplicates allowed
            Pet.name2pet.setdefault(name, []).append(pet)
            return pet


class Cat(Pet):
    name2pet = {} # each class has its own registry


class Dog(Pet):
    name2pet = {}


def test():
    assert eval(repr(Cat("Teal'c"))) == Cat("Teal'c")

    pets = [Pet('a'), Cat('a'), Dog('a'), Cat.get('a'), Dog.get('a')]
    assert all(pet.name == 'a' for pet in pets)

    cat, dog = Cat.get('pet'), Dog.get('pet')
    assert repr(cat) == "Cat('pet')" and repr(dog) == "Dog('pet')"
    assert dog is not cat
    assert dog != cat    
    assert cat.name == dog.name

    assert all(v == [Cat(k), Dog(k)]
               for k, v in Pet.name2pet.items()), Pet.name2pet

    try: cat.name = "cat" # .name is read-only
    except AttributeError:
        pass

    try: assert 0
    except AssertionError:
        return "OK"
    raise AssertionError("Assertions must be enabled during the test")


if __name__=="__main__":
    print test()

pet.py

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