2009-09-01 40 views
7

Cho một PyObject * trỏ đến một đối tượng python, làm thế nào để tôi gọi một trong các phương thức đối tượng? Các tài liệu không bao giờ đưa ra một ví dụ về điều này:Gọi một phương thức trên một đối tượng

PyObject* obj = .... 
PyObject* args = Py_BuildValue("(s)", "An arg"); 
PyObject* method = PyWHATGOESHERE(obj, "foo"); 
PyObject* ret = PyWHATGOESHERE(obj, method, args); 
if (!ret) { 
    // check error... 
} 

Đây sẽ là tương đương với

>>> ret = obj.foo("An arg") 

Trả lời

7
PyObject* obj = .... 
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg"); 
if (!ret) { 
    // check error... 
} 

Đọc trên các Python C API documentation. Trong trường hợp này, bạn muốn object protocol.

PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...) 

Trả về giá trị: Tham chiếu mới.

Gọi phương thức có tên là phương pháp của đối tượng o với số biến C đối số. Đối số C là được mô tả theo định dạng Py_BuildValue() chuỗi sẽ tạo một bộ dữ liệu. Định dạng có thể là NULL, cho biết mà không có đối số nào được cung cấp. Trả lại kết quả của cuộc gọi trên thành công hoặc NULL về lỗi. Đây là tương đương với biểu thức của Python o.method(args). Lưu ý rằng nếu bạn chỉ vượt qua PyObject * args, PyObject_CallMethodObjArgs() là một thay thế nhanh hơn .

PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL) 

giá trị Return: tài liệu tham khảo mới.

Gọi phương thức của đối tượng o, trong đó tên của phương thức được đưa ra làm đối tượng chuỗi Python có tên. Số điện thoại được gọi với số biến là PyObject* đối số. Đối số là được cung cấp dưới dạng số biến số thông số theo sau là NULL. Trả lại kết quả của cuộc gọi thành công hoặc NULL về lỗi.

+0

Biết gì "giao thức Object" là là vấn đề. Ngoài ra, tôi đã tìm kiếm lời gọi vì một lý do nào đó. Cảm ơn. – jmucchiello

3

dụ của bạn sẽ là:

PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg"); 
+0

Tôi biết 7 năm của nó quá muộn nhưng những gì hiện (s) có nghĩa là trong định dạng arg.? – JMzance

+0

Đó là chuỗi định dạng giống như được sử dụng bởi Py_BuildValue: các parens có nghĩa là nó sẽ xây dựng một tuple, s có nghĩa là đối số tiếp theo ("An arg") sẽ là một chuỗi C char *, được chuyển đổi thành một chuỗi Python. Tuple được sử dụng như các đối số vị trí của hàm, vì vậy chúng ta đang truyền một chuỗi. –

+0

Điều gì sẽ xảy ra nếu tôi muốn chuyển một mảng c dưới dạng danh sách các chuỗi hoặc danh sách các cặp đôi như '['kks', 'sss', 'www', 'sse']' hoặc '[323.9, 32, 443, 434.8,56,6] '? – jaykumarark

Các vấn đề liên quan