4

同じ基本クラスから継承するが、互いに遊びたくない 2 つのクラスがあります。実際には若いクラスです。

class A() : 
  ...

class B(A) : 
  ...

class C(A) : 
  ...

b=B()
c=C()
c.method(b)

c と b の TypeError が同じではありません。Python はそれらが同じであると考える必要がありますか? __SpecialThingIDontKnowAbout__ プロパティ/メソッドを実装する必要がありますか? または、私が見逃しているクラス設計のトリックはありますか

特に、次のように TreeDict() を継承しています。

class TNode(TreeDict):
 def __init__(self,*args,**kwargs) : 
  super(TNode, self).__init__(*args, **kwargs)

class LNode(TreeDict):
 def __init__(self,*args,**kwargs) : 
  super(LNode, self).__init__(*args, **kwargs)

TN = TNode(); TN.A = 1
LN = LNode(); LN.A = 1
LN.attach('TN',TN)

与える

Traceback (most recent call last):
  File "JSONE.py", line 430, in <module>
  LN.attach(TN)
TypeError: descriptor 'attach' requires a 'treedict.treedict.TreeDict' ...
object but received a 'type'

子供が「タイプ」であり、「treedict ^ 3」が必要であることは理解していますが、子供にこの動作を模倣させるにはどうすればよいですか?

編集 :

うーん...元に戻す/やり直しの履歴に表示されるものとは違うことをしたわけではありません(ありがとうございました)

4

1 に答える 1

1

問題は、TreeDictタイプがサブクラス化を許可しないことです。treedictパッケージで見つけました。TreeDictタイプ自体はCythonで書かれています。原因は、メソッド内の次のコードブロックですattach()(treedict.pyxの1910行目あたり)。

    if type(tree_or_key) is str:
        key = <str>tree_or_key
    elif type(tree_or_key) is TreeDict:
        if tree is not None:
            raise TypeError("Only one TreeDict instance can be given to attach.")

        tree = <TreeDict>tree_or_key
        key = None
    else:
        raise TypeError("`tree_or_key` must be either a string or TreeDict instance.")

elif type(tree_or_key) is TreeDict:行をに変更elif isinstance(tree_or_key, TreeDict):し、プロジェクトにパッチを送信します。同じバグが他に発生していないか、treedict.pyxの残りの部分を確認することをお勧めします。

于 2012-08-03T01:45:29.430 に答える