2013-08-31 2 views
2

제가 만든 프로젝트에서 사용하는 라이브러리가 있습니다. 라이브러리의 클래스 중 하나는 itertools를 사용하여 인스턴스화 될 때마다 증가하는 ID (현재 1부터 시작)를 생성합니다. 라이브러리를 사용하는 서버 데몬의 주 루프에서 알려진 ID를 기반으로 라이브러리에서 증가가 시작되는 위치를 초기화 할 수 있기를 원합니다. 이것은 데몬을 시작하고 중지 할 때 ID가 중단 된 곳에서부터 선택할 수 있습니다. 데몬은 db 백엔드에 대한 SQL 쿼리를 사용하여 올바른 시작점을 결정할 수 있지만 시작점으로 사용할 라이브러리에 전달하는 방법을 알 수는 없습니다. 현재 도서관에서 데이터베이스 쿼리에서 라이브러리의 itertools 개수를 초기화하십시오.

:

class Thing(object): 
    id_iter = itertools.count(1) 
    def __init__(self): 
     self.id = self.id_iter.next() 

나는 첫 번째 인스턴스의 클래스로 전달 될 수있는 변수에 1을 대체하고 싶습니다. 어떤 생각? 다른 접근법?

+0

처음으로 클래스의 인스턴스가 생성되면 ID가 설정된다는 것을 의미합니까? – Bakuriu

+0

서버가 시작될 때마다 db의 시작점을 결정하고 클래스 반복기 (라이브러리에 있음)의 시작점을 초기화하기 위해이 값을 전달해야합니다. – domoarrigato

답변

0
class Thing(object): 
    id_iter = None 
    def __init__(self, num=1): 
     if Thing.id_iter is None: 
      Thing.id_iter = itertools.count(num) 
     self.id = next(self.id_iter) 

예 :

x = Thing(5) 
print(x.id)  #prints 5 
y = Thing() 
print(y.id)  #prints 6 
+0

이 방법은 여전히 ​​나에게 도움이되지 않습니다. 라이브러리를 사용하는 서버에서 시작점을 전달하십시오. 이것이 없다면, 반복기는 서버가 다시 시작될 때 1시에 시작됩니다. 도서관으로 출발점을 가져 오는 것이 주요 문제입니다. – domoarrigato

+0

@domoarrigato - 다소 혼란 스럽습니다. 그래서'num = 1'을'__init__' 생성자에 포함 시켰습니다. 서버를 다시 시작하면 db의 시작점을 생성자에 전달할 수 있습니다. 예를 들어 나의 대답을보십시오. – gnr

+0

괜찮 았나. 문제는 Thing이 데몬에서 직접 인스턴스화되는 것이 아니라 라이브러리의 다른 클래스에 의해 인스턴스화 되었기 때문에 서버를로드 할 때 한 번 인스턴스를 직접 인스턴스화하여 인스턴스를 초기화해야한다는 것이 었습니다. 굉장해! – domoarrigato

0

당신은 임의의 인덱스에서 반복 시작 (정지) 할 itertools.islice를 사용할 수 있습니다. 당신이 당신의 특정한 경우에 사용하는 방법

>>> cycler = itertools.cycle(range(20)) 
>>> itertools.islice(cycler, 10, None).next() 
10 
>>> cycler.next() 
11 

클래스에 반복자 따라 그것은 어떻게 인스턴스화됩니다.