33

Pythonのメソッドはどの時点でgetプロパティを取得しますか?-クラスで定義されるとすぐに?Pythonで引数なしで(最初の引数でさえも)メソッドを定義できるのはなぜselfですか?

classmethodとの使い方をstaticmethod知っていて、それらが組み込み関数であることは知っていますが、そのように装飾された関数はどうなりますか?

基本的に、クラス定義とクラス構築の間で発生する「魔法」について疑問に思っています。

4

2 に答える 2

30

これをチェックしてください。

http://docs.python.org/howto/descriptor.html#static-methods-and-class-methods

funcobject.cで、クラスおよび静的メソッドオブジェクトのソースコードを確認することもできます。

http://hg.python.org/cpython/file/69b416cd1727/Objects/funcobject.c

クラスメソッドオブジェクトの定義は694行目から始まり、静的メソッドオブジェクトの定義は852行目から始まります(methodobject.cも存在する場合、funcobject.cに「method」というタイトルのアイテムがあるのはちょっとおかしいと思います)。

于 2011-07-13T20:40:49.913 に答える
7

参考までに、@JABの回答の最初のリンクから

非データ記述子プロトコルを使用すると、staticmethod()の純粋なPythonバージョンは次のようになります。

class StaticMethod(object):
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, objtype=None):
        return self.f

..。

非データ記述子プロトコルを使用すると、classmethod()の純粋なPythonバージョンは次のようになります。

class ClassMethod(object):
    "Emulate PyClassMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        def newfunc(*args):
            return self.f(klass, *args)
        return newfunc
于 2020-02-24T20:16:03.247 に答える