में परिभाषित प्रकार को उप-वर्गीकरण करते समय विधि को अनदेखा किया गया है, मैं कुछ मॉड्यूल और विधियों को उपनाम करने के लिए सी मॉड्यूल में परिभाषित एक प्रकार को उप-वर्गीकृत कर रहा हूं ताकि मेरी स्क्रिप्ट विभिन्न संदर्भों में काम करे।सी मॉड्यूल
यह कैसे काम करने के लिए है, मुझे अपनी कक्षा के शब्दकोश को मैन्युअल रूप से ट्विक करना है? यदि मैं डिक्शनरी में DistanceTo
का संदर्भ नहीं जोड़ता, तो मुझे Point3d has no attribute named DistanceTo
मिलता है।
class Point3d(App.Base.Vector):
def __new__(cls, x, y, z):
obj = super(Point3d, cls).__new__(cls)
obj.x, obj.y, obj.z = x, y, z
obj.__dict__.update({
'X':property(lambda self: self.x),
'Y':property(lambda self: self.y),
'Z':property(lambda self: self.z),
'DistanceTo':lambda self, p: self.distanceToPoint(p)})
return obj
def DistanceTo(self, p): return self.distanceToPoint(p)
मैं सोच रहा था कि एक बार __new__
एक उदाहरण लौटा था मैं अभी भी तरीके और विशेषताओं के साथ पॉप्युलेट सकता है। क्या कोई इस पर रोशनी डाल सकता है ?
संपादित करें: मैं जिस मॉड्यूल से आयात करता हूं वह फ्रीकैड है। सी बेस प्रकार there परिभाषित किया गया है। तब वेक्टर ली गई है प्रपत्र इस परिभाषा here
EDIT2: मैं भी करने की कोशिश की है:
class Point3d(App.Base.Vector):
def __new__(cls, x, y, z):
obj = super(Point3d, cls).__new__(cls)
obj.x, obj.y, obj.z = x, y, z
obj.__dict__.update({
'X': x, 'Y': y, 'Z': z,
'DistanceTo':lambda self, p: self.distanceToPoint(p)})
return obj
def DistanceTo(self, p): return self.distanceToPoint(p)
और एक दूसरे बिंदु बनाने के बाद, दोनों Point3d p
p.X
, p.Y
और p.Z
के लिए अंतिम बिंदु का मान देता है कोई फर्क नहीं पड़ता कि उदाहरण के निर्माण पर x,y,z
पैरामीटर पारित किए गए थे। p.x, p.y, p.z
अपेक्षित मान वापस करें। ऐसा लगता है कि शब्दकोश के बीच शब्दकोश साझा किया जाता है।
संपादित करें 3: समस्या हल हो गई! नीचे दिए गए उत्तर में बताए गए अनुसार subclassing को रोकने के लिए Py_TPFLAGS_BASETYPE बिट शून्य पर सेट है।
मुझे लगता है कि यह एक वैध उत्तर है, लेकिन मैं यहां के बजाय एक नए प्रश्न में अनुवर्ती प्रश्न पूछने की सलाह दूंगा। – MSeifert
क्षमा करें मैं थोड़ा सा शोध करने के बाद एक नया प्रश्न खोलूंगा। –