5

スクリプトがさまざまなコンテキストで機能するように、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.Xp.Yp.Zx,y,zp.x, p.y, p.z

EDIT 3: 問題が解決しました! Py_TPFLAGS_BASETYPE ビットは、以下の回答で説明されているように、サブクラス化を防ぐためにゼロに設定されています。

4

2 に答える 2

2

プロパティを動的に追加する理由がわかりません。使用するだけです:

class Point3d(App.Base.Vector):
    def __init__(self, x, y, z):
        super().__init__(x, y, z)  # or maybe  super().__init__([x, y, 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.
于 2016-04-19T19:44:34.970 に答える