2010-07-16 41 views
5

Tôi có một câu hỏi nhỏ về biến tĩnh và TypeObjects. Tôi sử dụng API C để bọc một đối tượng C++ (hãy gọi nó là Acpp) có một biến tĩnh gọi là x. Hãy gọi TypeObject A_Object tôi:API Python C++: "Biến tĩnh" cho đối tượng kiểu

typedef struct { 
    PyObject_HEAD 
    Acpp* a; 
} A_Object; 

Các TypeObject được gắn vào mô-đun python của tôi "myMod" là "A". Tôi đã xác định phương thức getter và setters (tp_getset) để tôi có thể truy cập và sửa đổi các biến tĩnh của Acpp từ python:

>>> import myMod 
>>> myA1 = myMod.A(some args...) 
>>> myA1.x = 34 # using the setter to set the static variable of Acpp 
>>> myA2 = myMod.A(some other args...) 
>>> print myA2.x 
34 
>>> # Ok it works ! 

giải pháp này hoạt động nhưng nó không thực sự "sạch". Tôi muốn truy cập biến tĩnh trong python bằng cách sử dụng TypeObject và không phải là trường hợp:

>>> import myMod 
>>> myMod.A.x = 34 # what I wish... 

Có ai có ý kiến ​​giúp tôi không?

Xin cảm ơn trước.

Trả lời

1

Về cơ bản, những gì bạn đang cố gắng làm là xác định "thuộc tính tĩnh". Tức là, bạn muốn một hàm được gọi khi bạn nhận/thiết lập một thuộc tính của lớp đó.

Với ý nghĩ đó, bạn có thể thấy this thread thú vị. Nó chỉ nói về các giải pháp mức Python đối với vấn đề này, chứ không phải các loại mở rộng C, nhưng nó bao hàm các nguyên tắc cơ bản.

Để triển khai giải pháp được đề xuất trong chuỗi cho loại tiện ích mở rộng C, tôi nghĩ bạn phải khởi tạo tp_dict và thêm vào đó mục nhập cho "x" có giá trị là đối tượng triển khai __get__ một cách thích hợp.

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ rằng tôi thực sự có thể giải quyết vấn đề của tôi bằng cách thêm một lĩnh vực để tp_dict sau khi gọi đến PyType_Ready. – ThR37

0

Bạn có thể thêm trường 'x' giả trong A_Object và tạo một cặp phương thức thiết lập/nhận. Khi bạn truy cập trường giả 'x', phương thức sẽ chuyển hướng cuộc gọi đến trường 'x' tĩnh.

+0

Cảm ơn câu trả lời của bạn, nhưng thực tế, vấn đề xuất phát từ thực tế là tôi không thấy bất kỳ cách nào để xác định một cặp phương thức set/get cho chính TypeObject: tất cả những gì chúng ta có thể định nghĩa là cho các thể hiện kiểu . Vì vậy, khi tôi cố gắng để lập hoá đơn myMod.A.x tôi nhận được trong phiên bản hiện tại của tôi: Tôi không thấy điểm thêm một trường trong A_Object. Tôi có thể dễ dàng truy cập "x" bởi Acpp :: x (đó là những gì tôi làm trong cặp getter/setter được định nghĩa cho các cá thể của đối tượng kiểu). – ThR37

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