管理对象实例

时间:2009-09-15 14:18:36

标签: javascript python actionscript-3 oop

我希望能够创建和未知数量的对象。我不确定是否有更好的方法来管理和引用它们。

让我们使用一个标准的OOP示例...说每次用户在文本字段中输入宠物的名称并单击按钮时,就会通过petFactory函数创建一个新的宠物对象。

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

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

由于没有办法,我知道(除了eval函数),每次调用petFactory时动态地为宠物使用一个新的,唯一的变量名,x被重新分配给一个新对象而最后一只宠物丢失了。我一直在做的是在宠物对象初始化后将其推送到阵列上。

petArray.push(this);

所以,如果我想要名为'mrFuzzyButtoms'的宠物,我可以循环索引数组,直到找到具有实例变量'mrFuzzyButtoms'的对象

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

或者我可以使用关联数组...无论如何......但是数组是我知道的唯一方法。除了使用eval函数从字符串创建唯一的变量名称,但某些语言没有eval函数(actionscript3),然后存在安全风险。

有更好的方法吗?

修改: 现在我正在使用Python,JavaScript和ActionScript。

3 个答案:

答案 0 :(得分:3)

“我可以使用关联数组”正确。

“数组是我知道的唯一方法。”

尽快了解“Mappings”或“Dictionaries”。你会发现它完全符合你的要求。

您使用的是哪种语言?如果您提供特定语言,我们可以提供指向该语言的“地图”结构的特定链接。

答案 1 :(得分:2)

这是什么集合类(列表,字典/映射,集合);收集一些实例。对于上面的情况,我可能会使用从名称到对象的地图(类名因语言而异)。

答案 2 :(得分:0)

#!/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