0

私は一連の関数を作成しましたが、それらを使用してクラスを構築するというアイデアをいじっています。それらをすべて書き直す代わりに、クラスから呼び出したいと思います。これを行う正しい方法は何ですか?次のことが考えられます。

退屈な機能ですが、アイデアを与えてくれます。

def my_func( a_dict, a_tuple ):
    a,b = a_tuple
    a_dict[a] = b
    return a_dict

私が考えた方法は以下の2つです。

class MyDict(dict):
    def my_method(self, a_tuple):
        return my_func(self, a_tuple)

また:

import functools
class MyOtherDict(dict):
    def __init__(self):
        self.my_parital = functools.partial(my_func, self)

以下も同様に機能することが指摘されています。これは最も単純なようです!

class MySimpleDict(dict):
    my_method = my_function

質問のわずかな拡張:

これを行う(メソッドから関数を呼び出す)のは一般的ですか?

4

4 に答える 4

3

3番目のものさえあります:

class MyThirdDict(dict):
    my_method = my_func

これは、関数がクラス スコープで定義されているかのように動作します。関数にアクセスするたびに、関数の が呼び出さ__get__れ、メソッドが生成されます。

その上、あなたの最初のアプローチでは、私はやります

class MyDict(dict):
    def my_method(self, a_tuple):
        return my_func(self, a_tuple)

動作を 100% 同一にするためです。

あなたの2つのアプローチから、最初のものは間違いなく読みやすいです。

于 2012-06-19T17:12:33.313 に答える
1

もっと単純なものはどうですか...

def my_func( a_dict, a_tuple ):
    a,b = a_tuple
    a_dict[a] = b
    return a_dict

class MyDict(dict):
    my_method = my_func
于 2012-06-19T17:12:46.073 に答える
1

インスタンス メソッドは、クラスの属性である単なる関数であるため、ここでは次のように動作します。

class MyDict(dict):
    my_method = my_func

例えば:

>>> def my_func( a_dict, a_tuple ):
...     a,b = a_tuple
...     a_dict[a] = b
...     return a_dict
... 
>>> class MyDict(dict):
...     my_method = my_func
... 
>>> d = MyDict()
>>> d.my_method(('a', 'b'))
{'a': 'b'}
>>> d
{'a': 'b'}

selfこれは、最初のパラメーター名として使用されていないため、少し混乱しているように見えますが、同じように機能します。MyDictインスタンスは引数として渡されますa_dict

于 2012-06-19T17:13:07.620 に答える
0

前者はおそらくよりクリーンであると見なされます-あなたの中に「メソッド」を作成すること__init__は一種の厄介です(そしてそれらのメソッドがクラス定義に表示されないことも意味します)。

于 2012-06-19T17:10:51.123 に答える