2012-03-23 2 views
1

私はcollections.MutableSequenceを継承しようとしている:Python:MutableSequence派生クラスに対して__new__を定義する方法は?

class myList(MutableSequence): 
    def __new__(cls,*kwargs): 
     obj=MutableSequence.__new__(cls,*kwargs) 
     return obj 

私はエラーを取得する:

>>>a=myList() 
>>>TypeError: Can't instantiate abstract class ContactMapList with abstract methods __delitem__, __getitem__, __len__, __setitem__, insert 

私はビルトインから直接私のクラスを派生されたときに私はすべてのエラーを取得していません同じ方法でリストクラスは:

class myList(list): 
    def __new__(cls,*kwargs): 
     obj=list.__new__(cls,*kwargs) 
     return obj 

私はなく、運ではmyList(MutableSequence)のコンストラクタを定義する方法を検索しようとしました:(

+1

答えは「抽象クラスをインスタンス化できません」です。 – katrielalex

+3

MutableSequenceから継承する方法の例については、[this](http://stackoverflow.com/a/5104787/566644)の回答を参照してください。 –

答えて

1

抽象クラスをインスタンス化することはできません。非抽象クラスをインスタンス化できます。それはあなたの質問に答えます。

未回答の質問です:なぜあなたは最初の場所で__new__を定義していますか?

+0

次に、このMutableSequenceの派生クラスのコンストラクタを定義する手順は何ですか?私はこれにかなり__new__ですので、私と一緒にご負担ください:) – jmborr

+1

@jmborrなぜあなたはコンストラクタを定義したいですか? '__init__'の何が間違っていますか? – Marcin

+0

何も、私の無知。私は私のエラーメッセージを理解し始めている。これは、私が言及した抽象メソッドをオーバーライドする必要があることを意味します。 – jmborr

2

抽象基底クラスは、契約です。それは、それから派生するクラスが保持しなければならない約束のリストです。

約束collectionsの各クラスはthe docsに記載されています。たとえば、MutableSequenceから継承するものは、__getitem__,__setitem__,__delitem__などがあります。

契約をインスタンス化することはできません。あなたは抽象基本クラスから継承するクラスを作るとき


、あなたがメソッドを継承しません。 (まあ...下記の注を参照してください)あなたは単なるプレースホルダーである "抽象メソッド"の束を継承します。あなたがABCから継承して作った約束を果たすためには、これらの方法の定義を与えなければなりません。彼らは好きなことをすることができますが、彼らはそこにいなければなりません。

実は、あなたが継承する方法には、本当の方法であることができますし、super()でそれらに委任することができます。これにより、デフォルトの動作を指定できます。しかし、それはよく使用されていません。

+0

実際に契約を具体化することができます。この答えはおそらく、あなたが伝えようとしていることをまだ知らない人にとっては何の意味もありません。 – Marcin

+0

@Marcin '実際に、契約を具体化することができます。どのように抽象基本クラスをインスタンス化できますか? – katrielalex

+0

標準形式の契約を締結します。それを記入してください。契約をインスタンス化しました。 – Marcin

関連する問題