2017-12-14 8 views
-1

이미지 버퍼 용 클래스를 만듭니다. 클래스는 다음과 같이 보입니다 :ctypes 속성이있는 Python 클래스에는 부작용이 있습니다.

import ctypes 

class ImgBuf(): 
    def __init__(self, bufnr=ctypes.c_int(-1)): 
     self.bufnr = bufnr 

'bufnr'속성은 참조로 공유 라이브러리에 전달되고 버퍼 관리를 위해 변경되었습니다. 이 클래스의 인스턴스를 여러 개 갖고 싶습니다 (여러 이미지 버퍼를 관리하기 위해). 작은 예

import imgBuf.ImgBuf 
buf1 = dicamsdk.ImgBuf() 
buf2 = dicamsdk.ImgBuf() 
sharedDLL.allocateBuffer(buf1) 

bufNr에서는 두 경우에 변경되었다. 인스턴스를 독립적으로 만들려면 어떻게해야합니까?

+0

, 나는 형식 오류'얻을 : 새 객체 각 함수가 호출 될 시간을 만들어야합니다 '전화. 이게 당신이 실제로 도망 간 것입니까? – user2357112

+0

실제로 코드가 줄었기 때문에 유형이있었습니다. 그것을 바로 잡았습니다. 감사. – smiddy84

답변

-1

가 냈다 다음 코드를 참조하십시오 :

from imgBuf import ImgBuf 
buf1 = ImgBuf() 
buf2 = ImgBuf() 
print('id(buf1) == id(buf2): ', id(buf1) == id(buf2)) 
print('id(buf1.bufnr) == id(buf2.bufnr): ', id(buf1.bufnr) == id(buf2.bufnr)) 

출력은 파이썬이 제대로 클래스 개체의 두 인스턴스를 생성하더라도

id(buf1) == id(buf2): False 
id(buf1.bufnr) == id(buf2.bufnr): True 

이다는하는 ctypes 값은 동일한 ID가 있습니다. 보통, 이것은 파이썬이 저장소를 관리하기 때문에 문제가되지 않습니다. 그러나 이것은 사용중인 공유 라이브러리에는 적용되지 않습니다.

독립 인스턴스를 보장하기 위해 기본값이 복사되었습니다. 클래스는 다음과 같습니다.

import ctypes 
from copy import copy 

class ImgBuf(): 
    def __init__(self, bufnr=ctypes.c_int(-1)): 
     self.bufnr = copy(ctypes.c_int(bufnr)) 

이제 객체는 독립적이어야합니다 (다시 실행 코드가 다시 잠겨 야 함).

1

bufnr과 같은 kwarg의 기본값은 def 문을 읽을 때로드 시간에 한 번만 계산됩니다. 따라서이 경우 c_int이 한 번 생성되고 명시 적으로 bufnr이 지정되지 않은 모든 ImgBuf 인스턴스에 동일한 인스턴스가 사용됩니다.

이 문제를 피하려면 None을 기본값으로 사용하고 is None을 확인하고 필요할 경우 매번 새로운 인스턴스를 생성하는 함수 본문에 기본값을 인스턴스화하십시오.

목록, dicts 등과 같이 기본값으로 사용되는 다른 변경 가능한 개체에도 동일하게 적용됩니다. this link을 참조하십시오.

2

ctypes.c_intlist과 같이 변경할 수 있으며, 이는 매우 일반적인 실수로 기본 인수로 사용해서는 안됩니다. 은`ctypes.c_int (bufnr)에 정수가 필요합니다 (유형 c_int있어)`: 나는 그것을 실행하려고하면

class ImgBuf(): 
    def __init__(self, bufnr=None): 
     if bufnr is None: 
      bufnr = ctypes.c_int(-1) 
     self.bufnr =ctypes.c_int(bufnr) 
관련 문제