파이썬 3.3을 사용하여 Test
클래스를 TestManager
이라는 다른 클래스에 바인드하여 관리자가 Test
의 인스턴스를 만들고 이후에 액세스 할 수있게 저장하려고합니다.초기화시 클래스의 인스턴스를 만들고 저장하는 방법은 무엇입니까?
> t = Test.objects.get(id=3)
> t.name
# Returns 'Name 3'
트릭은 내 컬렉션이다 : 간단히 말해서 (나는 ..., 파이썬 쉘을 의미), 나는이 작업을 수행 할 수 있도록하려면에서
은 (name
를 가정하는 것은
Test
의 속성) 객체는 처음에는 (어떤 사용자도 아닌) 생성되고 수정되거나 삭제되지 않으며 레코드가 제거되거나 편집된다는 의미에서 "정적"컬렉션입니다. 고쳐졌습니다. 그래서 여기에 내가 노력 코드입니다 :
class TestManager:
def __init__(self, *args, **kwargs):
self._tests = [Test(name='Name {}'.format(i)) for i in range(100)]
def get(self, id):
return self._tests[id]
class Test:
objects = TestManager()
def __init__(self, name=''):
self.name = name
Aaaand, 예상대로 NameError: global name 'Test' is not defined
인해 원형 초기화합니다. 이상적으로는 (__init__()
대신) 목록에 요소를 추가하는 관리자에서 create()
메서드를 가져야하지만 이는 관리자가 아니라 다른 곳에서 작성이 완료되었음을 의미합니다.
"최상의"해결책은 지금까지 get()
메서드가 처음에는 목록이 비어 있는지 확인하여 fill_the_damn_list()
메서드를 호출하는 것이지만 매우 나에게 해가되는 것처럼 보입니다. 이를 수행하는 또 다른 방법은 목록 대신 사전을 사용하고 처음에는 get()
에서 인스턴스를 생성하는 것입니다. 후자의 이점은 쓸데없는/절대로 get()
-ed 인스턴스를 만들지는 않지만 전체적으로 백 개만있는 것이므로 정말로 중요하지 않으며이 솔루션의 hackish-ness는 완전히 동일하게 보입니다. 나에게 ...
파이썬 (내가 충분히 명확하지 않다면 ...)에 익숙하지 않기 때문에, 그렇게 할 수있는 더 좋은 방법이 있는지, 그리고 그것을 간결하게 유지할 수 있을지 궁금하다. 또한 필요한 경우 리팩토링하는 것이 좋습니다. 그러나 아직 더 좋은 해결책을 찾지 못했습니다.
이 순환 참조는 무엇에 좋은가요? "TestManager"에 테스트 목록이 있으면 충분하지 않아야합니까? – Hyperboreus
클래스 생성 후'objects' 속성을 할당하십시오. 클래스 코드를'None'으로 설정하고'Test' 클래스 코드 바로 다음에'TestManager()를 설정하십시오. – Bakuriu
이 디자인은'object' 공장과 비슷한 모양입니다. 그것이 쓰여지는 방법을 많이 이해하지는 못합니다. _TestManager_는 컬렉션에 색인을 생성하는 데 사용되어야하며이 컬렉션에 도착하려면 _Test_ 클래스를 거칠 필요가 없습니다. – sean