2011-06-24 37 views
5

Tùy chọn -builtin của SWIG có lợi thế là nhanh hơn và được miễn lỗi với nhiều thừa kế.
Các trở ngại là tôi không thể đặt bất kỳ thuộc tính trên các lớp được tạo ra hay bất kỳ lớp con:
-Tôi có thể kéo dài một loại BUILTIN python như danh sách, không rắc rối, bởi subclassing nó:Mở rộng các lớp nội trang SWIG

class Thing(list): 
    pass 

Thing.myattr = 'anything' # No problem 

-However sử dụng cách tiếp cận tương tự đối với loại nội trang SWIG, điều sau xảy ra:

class Thing(SWIGBuiltinClass): 
    pass 

Thing.myattr = 'anything' 

AttributeError: type object 'Thing' has no attribute 'myattr' 

Làm cách nào để khắc phục sự cố này?

+0

Tôi nghĩ rằng nó nên được chỉ ra rằng tu sĩ của giải pháp cho vấn đề này là hoàn toàn đầy đủ, nhưng nó có thể phủ nhận tất cả những lợi ích của việc sử dụng '-builtin' ở nơi đầu tiên . Tất nhiên, trong trường hợp của tôi, tôi có một lớp cần tốc độ mà tôi không phân lớp; nhưng tôi cũng có một lớp khác mà tôi làm lớp con. Đó là một kỹ thuật thực sự hữu ích. – Mike

Trả lời

3

Tôi đã vô tình tìm được giải pháp. Tôi đã thử nghiệm với metaclasses, nghĩ rằng tôi có thể quản lý để ghi đè các hàm setattrgetattr của kiểu nội trang trong lớp con.

Làm điều này tôi phát hiện ra các nội trang đã có một metaclass (SwigPyObjectType), vì vậy metaclass của tôi đã kế thừa nó.

Và đó là nó. Điều này một mình giải quyết được vấn đề. Tôi sẽ rất vui nếu ai đó có thể giải thích tại sao:

SwigPyObjectType = type(SWIGBuiltinClass) 

class Meta(SwigPyObjectType): 
    pass 

class Thing(SWIGBuiltinClass): 
    __metaclass__ = Meta 

Thing.myattr = 'anything' # Works fine this time 
Các vấn đề liên quan