4

この動作を模倣するクラスを作成する必要があります (数学では、listdictは「べき等」であると言います)。

>>> list(list([3,4]))
[3, 4]
>>> dict({'a':1,'b':2})
{'a':1,'b':2}

だから、Aが私のクラスなら、私は書きたい

>>> a = A(1)
>>> b = A(a)
>>> b == a
True

私のクラスAは次のように見える必要があると思います:

class A(object):
   def __init__(self,x):
       if isinstance(x, A) : 
           self = x
       else : 
           self.x = x
           self.y = 'hello'

やってみる

>>> A(1).x
1
>>> A(A(1)).x
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute 'x'

それは動作しません !

x属性をselfにコピーしたくありません。selfをxまたは "point" xにしたいだけです。

いくつかのアイデア?ありがとう

4

1 に答える 1

11

探しているのは、クラスが構築される前__new__()に実行されるメソッドであり、後で実行される ではありません。を使用すると、作成中のオブジェクトをフックして置き換えることができます。__init__()__new__()

def __new__(cls, x):
    if isinstance(x, A):
        return x
    else:
        return object.__new__(cls, x)

__init__()オブジェクトが既に作成されているため、これを行うことはできません。変更selfはローカル変数の値を変更するだけで、オブジェクトには影響しません。

また、Python で型チェックを行うのはほとんどの場合、間違っていることにも注意してください。代わりに、クラスに必要な情報/属性があるかどうかを確認してください。このようにして、誰かがあなたのように振る舞い、あなたのコードで動作するクラスを作成できます。

警告の最後の言葉として、これはかなり紛らわしい振る舞いです - 人々はあなたのクラスがこのように振る舞うとは思っていませんし、一般的には良い考えではありません. との例はlist()dict()ここで行っていることには正確ではありませlist(some_list)ん。some_listsome_listdict()

>>> x = [1, 2, 3]
>>> list(x) is x
False 

コンストラクターを呼び出すときは、既存のオブジェクトへの参照ではなく、新しいオブジェクトを期待するのが自然です。A(some_a)copyを作成some_aし、に依存しないように呼び出しコードを再構築することをお勧めしますA(some_a) is some_a)。

于 2012-11-16T15:15:44.167 に答える