2

staticmethodが属するクラスの名前を見つける方法はありますか?

class A(object):
    @staticmethod
    def my_staticmethod():
        return 'static'

    @classmethod
    def my_classmethod():
        return 'classmethod'


In [2]: A.my_staticmethod
Out[2]: <function utils.my_staticmethod>

In [3]: A.my_classmethod
Out[3]: <bound method type.my_classmethod of <class 'utils.A'>>
In [4]: A.my_classmethod.im_self.__name__
Out[4]: 'A'

classmethodの場合、経由でクラスの名前を取得できますがA.my_classmethod.im_self.__name__、staticmethodの場合はわかりませんでした。

何か案が?ありがとう。


さて、実際にここに私がやろうとしていることがあります。関数/クラスメソッド/静的メソッドを「シリアル化/逆シリアル化」するために2つの関数を作成しようとしています。

つまり、誰かが関数をシリアル化関数に渡して文字列を取得できるということです。

a_string = serialize(A.my_classmethod)

この文字列は、たとえばDBに格納できます。次に、この文字列は、関数を解決して呼び出すことができるようにするのに十分である必要があります。

# later on...
f = deserialize(a_string)
# I can use my function
f(...)

関数またはclassmethodで機能させることはできますが、staticmethodで機能させることはできません。これは、それが属するクラスを把握してgetattrを使用できないためです...

4

2 に答える 2

1

「ブードゥー」を使用すると、それを解決できますが、真剣に-データモデルを回避しようとしているだけです-そしてそれは何のために良いのでしょうか?クラスメソッドが必要な場合は、クラスメソッドを使用します。それらが交換可能であることが意図されていた場合、それらは違いはありません!

そしてまた:

@classmethod
def my_classmethod():
    return 'classmethod'

本当にあるべきです:

@classmethod
def my_classmethod(cls): # assuming no args
    return cls.__name__ # instead of A.my_classmethod.im_self.__name__
于 2012-07-28T21:06:06.653 に答える
0

シリアル化/逆シリアル化に関するコメントに応じて、インターフェイスを変更できます。

def serialize(cls, function):
    return '{cls}.{func}'.format(cls=cls.__name__, func=function.__name__)

sys.modules[__name__].__name__また、モジュールレベルの機能に使用できます。

デシリアライズには便利な場合がありますinspect.classify_class_attrs(cls)

于 2012-07-28T22:16:35.740 に答える