python– 子类化C模块中定义的类型时忽略的方法

python– 子类化C模块中定义的类型时忽略的方法,第1张

概述我正在将C模块中定义的类型子类化为别名的一些属性和方法,以便我的脚本在不同的上下文中工作.如何让它工作,我必须手动调整我班级的字典?如果我没有在dictionnary中添加对DistanceTo的引用,我得到Point3d没有名为DistanceTo的属性.class Point3d(App.Base.Vector): def __new__(c

我正在将C模块中定义的类型子类化为别名的一些属性和方法,以便我的脚本在不同的上下文中工作.

如何让它工作,我必须手动调整我班级的字典?如果我没有在dictionnary中添加对distanceto的引用,我得到Point3d没有名为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,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__返回了一个实例,我仍然可以使用方法和属性来填充它.任何人都可以对此有所了解吗?

编辑:我导入的模块是FreeCAD. C基类型定义为there.然后,从此定义here导出Vector

编辑2:我也尝试了以下内容:

class Point3d(App.Base.Vector):      def __new__(cls,z          obj.__dict__.update({               'X': x,'Y': y,'Z': z,p: self.distancetoPoint(p)})           return obj       def distanceto(self,p): return self.distancetoPoint(p)

并且在创建第二个点之后,无论在创建实例时传递了什么x,z参数,Point3d p都返回p.X,p.Y和p.Z的最后一个点的值. p.x,p.y,p.z返回预期值.它似乎表明字典是在实例之间共享的.

编辑3:问题解决了! Py_TPFLAGS_BASETYPE位设置为零以防止子类化,如下面的答案中所述.

最佳答案我不明白为什么要动态添加属性.只需使用:

class Point3d(App.Base.Vector):    def __init__(self,z):        super().__init__(x,z)  # or maybe  super().__init__([x,z])    @property    def X(self):        return self[0]  # guessing that App.Base.Vector works like a List    @property.setter    def X(self,value):        self[0] = value    # Y and Z likewise.
总结

以上是内存溢出为你收集整理的python – 子类化C模块中定义的类型时忽略的方法全部内容,希望文章能够帮你解决python – 子类化C模块中定义的类型时忽略的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存