スクリプトがさまざまなコンテキストで機能するように、C モジュールで定義された型をサブクラス化して、いくつかの属性とメソッドにエイリアスを設定しています。
これを機能させるには、クラスの辞書を手動で微調整する必要がありますか? 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__
インスタンスを返したら、メソッドと属性をまだ入力できると考えていました。誰でもこれに光を当てることができますか?
編集:インポート元のモジュールはFreeCADです。C の基本型はそこで定義されています。次に、Vector はこの定義から派生します。
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)
2 番目のポイントを作成した後、インスタンスの作成時に渡されたパラメータに関係なく、両方の Point3dp
が の最後のポイントの値を返します。期待値を返します。辞書がインスタンス間で共有されていることを示しているようです。p.X
p.Y
p.Z
x,y,z
p.x, p.y, p.z
EDIT 3: 問題が解決しました! Py_TPFLAGS_BASETYPE ビットは、以下の回答で説明されているように、サブクラス化を防ぐためにゼロに設定されています。