2017-03-06 6 views
1

그래서 각 속성이 내 데이터베이스에 고유 한 호출을하는 다른 이름을 가진 클래스에 속성을 동적으로 설정하려고합니다. 그러나 속성 객체에 액세스 할 때 모두 다른 값을 가진 다른 열을 각각 조회하더라도 동일한 결과를 반환합니다. 여기서 코드 :다른 기능, 동일한 결과

class Configs: 

    def __init__(self, guild_id): 
     self.guild_id = guild_id 

for x in configs: 

    def fget(self): 
     return cur.execute(f'SELECT {x.name} FROM configs WHERE guild_id = ?', (self.guild_id,)).fetchone()[0], x.name 

    def fset(self, value): 
     cur.execute(f'UPDATE configs SET {x.name} = ? WHERE guild_id = ?', (value, self.guild_id)) 
     con.commit() 

    setattr(Configs, x.name, property(fget, fset)) 

CONFIGS 변수는 각 객체가 가리키는 문자열 name 특성이 개체의 목록이다. 결과는 언제나 configs 배열의 마지막 요소가 생성하는 결과입니다. x.name이 호출을하기 위해 사용되고 for 루프가 완료되면 x가 배열의 마지막 요소로 남아 있기 때문에 이것이 발생하고있는 것 같습니다.

+0

'x' 무엇인가

a = [] for i in range(3): def f(): return i a.append(f) a[0]() # will return 2 del i a[0]() # will raise a NameError because there is no i anymore 

당신은 함수로 정의 시간에 값을 전달해야하는 문제를 해결하기 위해? 그것은'Configs'입니까? 'x.name'의 값은 어디에서 설정합니까? – khelwood

+1

'x'는 하나의'name' 속성을 가진 간단한 객체로 미리 지정된 문자열을 가지고 있습니다. 나는 코드의 다른 부분에서이 객체들을 만들고있다. 'configs'는 3 개 이상의 객체를 가진 목록 일뿐입니다. – Exa

+0

그래서'x.name'의 값이 무엇이든, 접근 할 때 데이터베이스에서 읽고 쓰는 속성을 설정하려고합니다. 적극적인 기록처럼? – khelwood

답변

1

함수를 정의하면 함수를 정의 할 때 변수 값에 바인딩한다는 잘못된 인상을받습니다. 이것은 복잡하게 들린다. 미안. 나는 설명하려고 노력할 것이다.

함수를 루프로 정의하고 있습니다 (fget, fset). 함수에서 루프 변수 (x)를 사용합니다. 이것은 작동하지만 예상대로 작동하지는 않습니다. 모든 함수는 정확히 똑같을 것이고, 호출 할 때 항상 글로벌 변수 x의 값에 액세스합니다.. 정의시의 값은 고려되지 않습니다.

예를 이것에 대한 참조 :

def fget(self, x=x): 
    return cur.execute(f'SELECT {x.name} FROM configs WHERE guild_id = ?', (self.guild_id,)).fetchone()[0], x.name 

def fset(self, value, x=x): 
    cur.execute(f'UPDATE configs SET {x.name} = ? WHERE guild_id = ?', (value, self.guild_id)) 
    con.commit() 
0

내가 수행하려고하는 것을 따라하면 속성 값이 호출 될 때 현재 값이 x.name 인 것을 사용합니다. (이 값은 마지막에 남은 값이됩니다. 귀하의 루프).

수정 가능한 방법은 다음과 같습니다. 속성 함수가 액세스 할 수있는 다른 변수에 x.name을 할당하십시오. 기본 인수가 그럴 수 있습니다.

for x in configs: 

    def fget(self, col_name=x.name): 
     return cur.execute(f'SELECT {col_name} FROM configs WHERE guild_id = ?', (self.guild_id,)).fetchone()[0], col_name 

    def fset(self, value, col_name=x.name): 
     cur.execute(f'UPDATE configs SET {col_name} = ? WHERE guild_id = ?', (value, self.guild_id)) 
     con.commit() 

    setattr(Configs, x.name, property(fget, fset))