23

Think Complexityでいくつかのコードを見ているときに、Graphクラスがそれ自体に値を割り当てていることに気付きました。そのクラスからいくつかの重要な行をコピーし、ObjectChildこの動作で失敗するクラスの例を書きました。

class Graph(dict):
    def __init__(self, vs=[], es=[]):
        for v in vs:
            self.add_vertex(v)

        for e in es:
            self.add_edge(e)

    def add_edge(self, e):
        v, w = e
        self[v][w] = e
        self[w][v] = e

    def add_vertex(self, v):
        self[v] = {}

class ObjectChild(object):
    def __init__(self, name):
        self['name'] = name

さまざまな組み込み型がすべてこれを使用する独自の方法を持っていると確信していますが、これを自分のクラスに組み込む必要があるかどうかはわかりません。それは可能ですか?これは私が気にするべきではないことであり、代わりに単純な構成に頼っていself.l = [1, 2, 3]ますか? 組み込み型以外では避けるべきですか?

「組み込みのpythonコレクションから継承することはほとんどない」と言われたため、質問します。私が自分自身を制限することをためらっているアドバイス。

明確にするために、それは「機能しない」ことを知っておりObjectChild、簡単に「機能」させることができますが、これらの組み込み型の内部の仕組みに興味があり、インターフェイスが の子とは異なりますobject

4

8 に答える 8

13

彼らはから継承することによってこの魔法を達成していdictます。これを行うためのより良い方法は、 UserDictまたは新しいコレクションから継承することです。MutableMapping

同じことを行うことで、同様の結果を達成できます。

import collections

class ObjectChild(collections.MutableMapping):
    def __init__(self, name):
        self['name'] = name

また、2つの特殊関数を定義して、クラスを辞書のようにすることもでき__getitem__(self, key)ます__setitem__(self, key, value)。この例は、Dive Into Python-SpecialClassMethodsで見ることができます。

于 2012-12-06T04:07:03.100 に答える
6

免責事項:私は間違っている可能性があります。

表記:

self[something]

fro dictを継承するため、Graphクラスでは正当です。この表記は、クラス属性宣言構文からではなく、辞書ssyntaxからのものです。

クラスに関連付けられているすべての名前空間は辞書ですが、クラスChildObjectでは、selfは辞書ではありません。したがって、その構文を使用することはできません。

音、あなたのクラスのグラフでは、自己はグラフであるため辞書であり、すべてのグラフはdictから継承するため辞書です。

于 2012-12-06T04:10:13.370 に答える
6

このようなものを使用しても大丈夫ですか?

def mk_opts_dict(d):
    ''' mk_options_dict(dict) -> an instance of OptionsDict '''
    class OptionsDict(object):
        def __init__(self, d):
            self.__dict__ = d

        def __setitem__(self, key, value):
            self.__dict__[key] = value

        def __getitem__(self, key):
            return self.__dict__[key]

    return OptionsDict(d)
于 2014-06-22T05:16:24.193 に答える
0

ObjectChildは、dictのサブクラスではないため、機能しません。これらのいずれかが機能します:

class ObjectChild(dict):
    def __init__(self, name):
        self['name'] = name

また

class ObjectChild(object):
    def __init__(self, name):
        self.name = name
于 2012-12-06T04:07:59.520 に答える
0

dict から継承する必要はありません。setitemおよびgetitemメソッドを提供すると、望ましい動作も得られると思います。

class a(object):
    def __setitem__(self, k, v):
        self._data[k] = v
    def __getitem__(self, k):
        return self._data[k]
    _data = {}
于 2015-02-03T15:39:51.570 に答える