2009-09-15 4 views
1

개체를 만들고 알 수없는 개체 수를 만들고 싶습니다. 나는 그들을 관리하고 참조하는 더 좋은 방법이 있는지 확실하지 않습니다.개체 인스턴스 관리

표준 OOP 예제를 사용합니다 ... 사용자가 텍스트 필드에 애완 동물의 이름을 입력하고 버튼을 클릭 할 때마다 petFactory 기능을 통해 새 애완 동물 개체가 생성됩니다.

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

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

방법은 동적으로 애완 동물을위한 petFactory가 호출 될 때마다 고유 한 새 변수 이름을 사용하려면 (평가 후면 기능 외에) 내가 아는 것이 없다 이후로는, x는 새로운 개체와 재 할당한다 마지막 애완 동물은 잃어버린다. 내가 뭘 해왔 던가 초기화 된대로 배열에 애완 동물 개체를 추진하고있다. 나는 'mrFuzzyButtoms'라는 이름의 애완 동물을 원하는 경우에 따라서

petArray.push(this); 

내가 할 수 내가 인스턴스 변수를 사용하여 객체를 찾을 때까지 인덱스 배열을 통해 루프 'mrFuzzyButtoms'

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

또는 내가 연관 배열을 사용할 수 있습니다 ... 뭐든간에 ... 배열은 내가 이것을 수행하는 유일한 방법입니다. eval 함수를 사용하여 문자열에서 고유 한 변수 이름을 만들지 만 일부 언어에는 평가 함수 (actionscript3)가 없으므로 보안 위험이 있습니다.

더 좋은 방법이 있나요?

편집 : 지금은 파이썬, 자바 스크립트 및 ActionScript로 작업하고 있습니다.

+0

킬 mrFuzzyBottoms은? Awww. 동물 학대! 얼마나 나쁜지! Btw, C#처럼 보이지만 Java 일 수도 있습니다. 언어 태그를 추가 할 수 있습니까? 아니면 모든 프로그래밍 언어에 일반적인 언어 태그입니까? –

답변

2

이 컬렉션 클래스 (목록, 사전 /지도, 집합)는 무엇입니까? 여러 인스턴스를 수집합니다. 위의 경우에 나는 아마도 이름에서 객체까지지도 (클래스 이름은 언어에 따라 다름)를 사용할 것입니다.

+1

파이썬에서는 이것을 "dict"라고하는데, C#에서는 제네릭 형식을 사용하지 않으려면 Dictionary 또는 Hashtable입니다. – PaulMcG

+0

AS3에서는 결합 배열 (또는 객체를 래핑하는 사용자 정의 클래스)로 취급되는 평범한 객체를 사용해야합니다. 사전도 사용할 수 있습니다. 당신의 경우에는 아무런 차이가 없습니다. – fenomas

+0

루비에서는 해시입니다. 자바에서는 맵 (하위 클래스 포함)이고 자바 스크립트 및 액션 스크립트에서는 네가 일반 객체를 사용하는 경향이 있습니다 (파이썬에서도 그렇게 할 수 있지만 일반적으로 권장하지 않습니다). –

3

"연관 배열을 사용할 수 있습니다." 정확함.

"이 작업을 수행하는 유일한 방법은 배열입니다."

최대한 빨리 "매핑"또는 "사전"에 대해 알아보십시오. 당신은 그것이 당신이 요구하는 것과 정확하게 일치한다는 것을 알게 될 것입니다.

어떤 언어를 사용하고 있습니까? 특정 언어를 제공하면 해당 언어로 된 "지도"구조에 대한 특정 링크를 제공 할 수 있습니다.

+0

감사합니다. 언어 태그를 추가했습니다. –

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

+0

예를 들어 주셔서 감사합니다. =) 나는 오늘 밤 깊이 이것을해야 할 것이다. –

관련 문제