Cモジュールで定義された型をサブクラス化して、いくつかの属性とメソッドを別名にしてスクリプトが異なるコンテキストで動作するようにします。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の基本型はthereと定義されています。
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
:私はまた、以下を試してみました:次いで、ベクターは、この定義here
EDIT2派生形でありますどのようなx,y,z
パラメータがインスタンスの作成時に渡されたかに関係なく、 p.x, p.y, p.z
は期待値を返します。辞書がインスタンス間で共有されていることを示しているようです。
編集3:問題が解決しました! Py_TPFLAGS_BASETYPEビットは、以下の答えで説明するように、サブクラス化を防ぐためにゼロに設定されています。
これは有効な答えだと思いますが、ここではなく新しい質問でフォローアップの質問をすることをお勧めします。 – MSeifert
申し訳ありません私は少しの研究をした後、新しい質問を開きます。 –