2014-04-04 2 views
0

PyCxx로 생성 된 Python 확장에서 속성을 정의하는 것이 적절한 방법이 무엇인지 궁금합니다. 현재 example과 같이 Py::PythonClass의 하위 클래스를 만들었습니다. 나는 초기화 기능에 behaviors().supportGetattro();을 추가하고 지금까지 너무 좋아PyCXX 확장에서 속성을 정의하는 올바른 방법은 무엇입니까

Py::Object getattro(const Py::String &name_) 
{ 
    std::string name(name_.as_std_string("utf-8")); 

    if(name == "name") 
    { 
     return m_name; 
    } 
    else 
    { 
     return genericGetAttro(name_); 
    } 
} 

의 간단한 재정을 만들었습니다. 파이썬에서 나는 obj.name으로 적절한 값을 얻었지만 나를 화나게하는 유일한 것은 dir(obj)을 호출 할 때 name 속성이 나열되지 않는다는 것입니다. 어떻게 바꿀 수 있습니까?

+0

어쩌면 질문은 PyCXX에서 속성을 선언하는 방법 일 것입니다. 속성에 접근하는 것은 위의 코드에서 작동하지만 PyCXX를 사용하지 않을 때'tp_getset'를 정의 할 때와 같이 객체의 속성과 메소드를 출력 할 때도 나열되도록하고 싶습니다. – Satara

+0

나는'PyGetSetDef()'를 사용하여 속성 선언을 추가하려고합니다. 유일한 장애물은'tp_getset' 변수 (protected)에 접근하는 것입니다. 그러나'PythonType'의 서브 클래스를 지금 도우미로 정의하고 있습니다. – Satara

답변

0

PyCXX 개발자 인 Barry Scott은 친절하게도 간단한 해결책을 제시했습니다. 트릭은 dir()을 호출 할 때 __members__의 값을 getattr(const char *_name)에 묻는 것입니다. 이 경우 속성 이름을 문자열로 포함하는 Py::List 객체를 반환 할 수 있습니다.

관련 문제