質問

Pythonで、辞書のように扱われるが、新しいインスタンスが作成されるときにキーが事前に定義されているクラスを作成する方法はありますか?

役に立ちましたか?

解決

任意の組み込み型を簡単に拡張できます。これは、dictを使用して行う方法です。

>>> class MyClass(dict):
...     def __init__(self, *args, **kwargs):
...             self['mykey'] = 'myvalue'
...             self['mykey2'] = 'myvalue2'
...
>>> x = MyClass()
>>> x['mykey']
'myvalue'
>>> x
{'mykey2': 'myvalue2', 'mykey': 'myvalue'}

これについて説明しているPythonドキュメントは見つかりませんでしたが、非常に人気のある本 Dive Into Python (オンラインで無料で利用可能)これを行う例がいくつかあります。 p>

他のヒント

__ setitem __()

をオーバーライドすることで、dictサブクラスにキーを事前定義リストに制限させることもできます
>>> class LimitedDict(dict):
    _keys = "a b c".split()
    def __init__(self, valtype=int):
        for key in LimitedDict._keys:
            self[key] = valtype()
    def __setitem__(self, key, val):
        if key not in LimitedDict._keys:
            raise KeyError
        dict.__setitem__(self, key, val)


>>> limited = LimitedDict()
>>> limited['a']
0
>>> limited['a'] = 3
>>> limited['a']
3
>>> limited['z'] = 0

Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    limited['z'] = 0
  File "<pyshell#56>", line 8, in __setitem__
    raise KeyError
KeyError
>>> len(limited)
3

はい、Pythonでは dict はクラスなので、サブクラス化できます:

    class SubDict(dict):
        def __init__(self):
            dict.__init__(self)
            self.update({
                'foo': 'bar',
                'baz': 'spam',})

ここで、dictの __ init __()メソッド(クラスのインスタンスが作成されたときに呼び出されるメソッド)をオーバーライドします。 __ init __ 内で、最初にsupercalssの __ init __()メソッドを呼び出します。これは、基本クラスの機能を拡張したい場合の一般的な方法です。次に、 SubDictionary の新しいインスタンスを初期データで更新します。

    subDict = SubDict()
    print subDict    # prints {'foo': 'bar', 'baz': 'spam'}

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、


grep{

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、


l = ["a","a","b","c","c","c"]
d = {}
for item in l:
    d[item] += 1

Traceback (most recent call last):
  File "./y.py", line 6, in 
    d[item] += 1
KeyError: 'a'

Pythonはこれを無料で提供しません:


from collections import defaultdict
from operator import itemgetter

l = ["a","a","b","c","c","c"]
d = defaultdict(int)
for item in l:
    d[item] += 1

dl = sorted(d.items(),key=itemgetter(1), reverse=True)
for item in dl:
    print item

('c', 3)
('a', 2)
('b', 1)

ただし、defaultdictがこれを行います

<*>{

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、

<*>

Pythonはこれを無料で提供しません:

<*>

ただし、defaultdictがこれを行います

<*>}++} qw/ a a b c c c /; print map{

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、

<*>

Pythonはこれを無料で提供しません:

<*>

ただし、defaultdictがこれを行います

<*>."\t".

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、

<*>

Pythonはこれを無料で提供しません:

<*>

ただし、defaultdictがこれを行います

<*>{

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、

<*>

Pythonはこれを無料で提供しません:

<*>

ただし、defaultdictがこれを行います

<*>}."\n"} sort {

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、

<*>

Pythonはこれを無料で提供しません:

<*>

ただし、defaultdictがこれを行います

<*>{$b}

これがあなたが探しているものかどうかはわかりませんが、あなたの投稿を読んだとき、運動を数えるためのキーを動的に生成しようとしているとすぐに思いました。

デフォルトでこれを行うperlとは異なり、

<*>

Pythonはこれを無料で提供しません:

<*>

ただし、defaultdictがこれを行います

<*>{$a}} keys %_; c 3 a 2 b 1

Pythonはこれを無料で提供しません:

<*>

ただし、defaultdictがこれを行います

<*>

dictのサブクラスを作成し、 init メソッドにキーを追加するだけです。

class MyClass(dict)

def __init__(self):
    """Creates a new dict with default values""""

    self['key1'] = 'value1'

ただし、Pythonでは「dictのように動作する」クラスは通常1つのように扱われるので、サブクラスであることをあまり心配する必要はありませんが、代わりにdictメソッドを実装できますが、上記のアプローチはおそらくあなたにとってより便利です:)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top