2010-04-04 10 views
6

मैं pysparse लाइब्रेरी से मैट्रिक्स प्रकार में कुछ अतिरिक्त विधियों को जोड़ने का प्रयास कर रहा हूं। इसके अलावा मैं चाहता हूं कि नई कक्षा मूल की तरह व्यवहार करे, इसलिए मैंने विरासत का उपयोग करके परिवर्तनों को लागू करना चुना। हालांकि, जब मैंपायथन: सी एक्सटेंशन से प्राप्त करने में असमर्थ

from pysparse import spmatrix 

class ll_mat(spmatrix.ll_mat): 
    pass 

कोशिश यह निम्न त्रुटि

TypeError: Error when calling the metaclass bases 
    cannot create 'builtin_function_or_method' instances 

क्या यह इस त्रुटि उत्पन्न कर रहा है में परिणाम है? क्या प्रतिनिधिमंडल का उपयोग करने का कोई तरीका है ताकि मेरी नई कक्षा मूल रूप से वैसे ही व्यवहार करे?

उत्तर

9

ll_mat को function होने के लिए प्रलेखित किया गया है - प्रकार स्वयं नहीं। मुहावरे को "फैक्ट्री फ़ंक्शन" के रूप में जाना जाता है - यह "तर्ककर्ता कॉल करने योग्य" को इसके तर्कों के आधार पर विभिन्न वास्तविक अंतर्निहित प्रकारों को वापस करने की अनुमति देता है।

आप इस से एक वस्तु पैदा करते हैं और उसके बाद उस वस्तु के प्रकार से विरासत की कोशिश कर सकते:,,

x = spmatrix.ll_mat(10, 10) 
class ll_mat(type(x)): ... 

बारे में पता होना कि हालांकि यह एक अंतर्निहित प्रकार यह समर्थन नहीं करेंगे घोषित करने के लिए काफी संभव है उप-वर्गीकृत किया जा रहा है (यह कुछ मामूली ओवरहेड को बचाने के लिए भी किया जा सकता है); अगर है कि क्या उस प्रकार करता है, तो आप यह उपवर्ग नहीं कर सकता है, और बजाय रोकथाम और प्रतिनिधिमंडल, यानी .:

class ll_mat(object): 
    def __init__(self, *a, **k): 
     self.m = spmatrix.ll_mat(*a, **k) 
     ... 
    def __getattr__(self, n): 
     return getattr(self.m, n) 

आदि, आदि

का उपयोग करना होगा
संबंधित मुद्दे