В чем разница между class.method class.staticmethod с одинаковыми параметрами? - PullRequest
0 голосов
/ 09 апреля 2019

Я написал простой скрипт:

class A:
    def print1(self):
        print(self)

    @staticmethod
    def print2(thing):
        print(thing)

A.print1('123')
A.print2('123')

print(A.print1)
print(A.print2)

И вывод:

123
123
<function A.print1 at 0x7f2f4a1778c8>
<function A.print2 at 0x7f2f4a17b510>

Сначала ДА или НЕТ: Кажется, сейчас A.print1 и A.print2 делают все то же самоепо функционалу, верно?

Как код из Python на Github :

/* Bind a function to an object */
static PyObject *
func_descr_get(PyObject *func, PyObject *obj, PyObject *type)
{
    if (obj == Py_None || obj == NULL) {
        Py_INCREF(func);
        return func;
    }
    return PyMethod_New(func, obj);
}

И версия Python StaticMethod из Дескриптор HowTo Guide

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

Второй ДА или НЕТ: A.print1 и A.print2 все просто получают функцию, очень похожую на print_pure, которая определена ниже, верно?

def print_pure(thing):
    print(thing)

1 Ответ

2 голосов
/ 09 апреля 2019

Если вы собираетесь вызывать методы из самого класса, как вы делаете в своем коде, «ДА», то нет никакой разницы.Однако вещи начнут отличаться, как только вы начнете вызывать эти методы с объектом класса.

Связанный метод или метод экземпляра - это функция, которая связана с объектом класса ивсегда будет требовать ссылку на объект класса в качестве первого аргумента.

Метод класса - это функция, которая связана с самим классом и всегда требует ссылку на сам классв качестве первого параметра.

Статические методы - это те, которые не связаны ни с классом, ни с объектом класса.

Даже с вашим кодом, если мне нравитсяthis.

a = A()
a.print2('123') # this will work just fine, since this is a static method
a.print1('123')  # this will give me the TypeError print1() takes 1 positional argument but 2 were given 

Поскольку print1 является экземпляром или связанным методом, поэтому, когда этот метод вызывается с объектом класса a, в этом случае для него требуется первый параметр в качестве ссылки на объект,Эта ссылка передается неявно при вызове метода с объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...