2016-10-29 13 views
0

현재 Python C API를 사용하여 Python (v3.5) 확장 모듈을 작성하는 방법을 배우고 있습니다. 빠른 수치 작업과 같은 일부 작업은 C로 수행하는 것이 가장 좋지만 문자열 조작과 같은 다른 작업은 Python에서 구현하기가 훨씬 쉽습니다. 새로운 유형을 정의하기 위해 Python과 C 코드를 모두 사용하는 합의 된 방법이 있습니까?Python과 C 모두에서 Python 클래스 정의하기

예를 들어, 기본 저장 및 산술 연산을 지원하는 C 형식의 Matrix을 작성했습니다. 파이썬을 사용하여 Matrix.__str__을 정의하고 싶습니다. 여기서 문자열 조작은 훨씬 쉬우 며 cstring에 대해 걱정할 필요가 없습니다. 이 코드를 실행하면, 나는 TypeError: can't set attributes of built-in/extension type 'matey.Matrix'를 얻을 수

from mymodule._mymodule import Matrix; 

def as_str(self): 
    print("This is a matrix!"); 

Matrix.__str__ = as_str; 

:

나는 __init__.py에서 모듈로드를 다음과 같이하면 __str__ 방법을 정의하려고했습니다. 이것을 할 수있는 방법이 있습니까? 솔루션이 서브 클래스 Matrix 인 경우 모듈 내에서 구성된 C 기본 클래스/Python 서브 클래스를 유지하는 가장 좋은 방법은 무엇입니까?

답변

0

저는 개인적으로 C에서 객체 지향적 인 것들을 시도하지 않을 것입니다. 나는 (stateless) 일부 기능을 드러내는 모듈 작성에 전념 할 것입니다.

파이썬 인터페이스가 객체 지향이되기를 원한다면, (C 확장자) 모듈을 가져 와서 함수를 사용하는 Python으로 클래스를 작성해야합니다. 모든 상태를 유지하는 것은 모두 파이썬으로 수행됩니다.

+0

구조체 아마 복잡한 데이터에 유용에 올 것이다 기존의 OOP 방식 (예를 들어, 행렬)로 확장 _Matrix 유형을 정의 할 수 있습니다. ctypes.Structure 봐봐 – eddiewould

+0

좋은 생각. 그러나, 나는'numpy' 배열이 어떻게 동작하는지 에뮬레이트하려고 노력하고 있습니다. (배우기 위해서, 저는 프로덕션에서 내 자신의 선형 대수 루틴을 롤백하는 것보다 낫습니다). 앞뒤로 복사하는 것이 너무 느리기 때문에 C에 행렬 데이터를 저장하고 싶습니다. –

+0

그래 - 그러므로 매트릭스 데이터를 표현하기 위해 C 구조체를 사용하라는 나의 제안. 파이썬에서 "앞뒤로 복사"하지 않고도 C 구조체에 액세스 할 수 있습니다. – eddiewould

0

대신 당신이 다음

from mymodule._mymodule import _Matrix; 

class Matrix(_Matrix): 
    def __str__(self): 
     return "This is a matrix!"