В чем разница между вызовом класса и вызовом метода в Python? - PullRequest
3 голосов
/ 17 августа 2010

Будучи, вероятно, одним из худших программистов ООП на планете, я прочитал множество примеров кода, чтобы помочь «понять», для чего может использоваться класс. Недавно я нашел этот пример:

class NextClass:                            # define class
    def printer(self, text):                # define method
        self.message = text                 # change instance
        print self.message                  # access instance

x = NextClass()                             # make instance

x.printer('instance call')              # call its method

print x.message                               # instance changed

NextClass.printer(x, 'class call')      # direct class call

print x.message                               # instance changed again

Похоже, что между прямым вызовом класса и вызовом экземпляра нет никакой разницы; но это противоречит дзену: включать такие функции без некоторого использования. Так что, если есть разница, что это? Спектакль? Сокращение накладных расходов? Может быть читабельность?

Ответы [ 3 ]

2 голосов
/ 17 августа 2010

Разницы нет. instance.method(...) - это class.method(instance, ...). Но это не идет вразрез с дзен, так как он говорит (выделение мое):

Должен быть один - и предпочтительно только один - очевидный способ сделать это.

Возможен второй способ, и каждый, кто хорошо знает Python, должен это знать (и почему), но это неочевидный способ сделать это, никто не делает этого в реальном коде.

Так почему же так? Это просто, как методы работают на любом языке - метод - это некоторый код, который работает с объектом / экземпляром (и, возможно, с большим количеством аргументов). За исключением того, что обычно, экземпляр предоставляется неявно (например, this в C ++ / Java / D) - но поскольку Zen говорит, что «явный лучше, чем неявный», self явно является параметром каждого метода, что неизбежно позволяет это. Явно запрещать это явно бессмысленно.

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

1 голос
/ 17 августа 2010

В этой ситуации разницы нет.В обоих вызовах вы предоставляете экземпляр этого класса:

x.printer('instance call')  # you supplied x and then called its printer method
NextClass.printer(x, 'class call')  # you supplied x as a parameter this time

Обычно, однако, я бы не стал писать второй метод очень часто.Я обычно думаю о любом методе, который работает с экземпляром, как метод экземпляра.Вещи как:

car.drive('place')
car.refuel
car.impound

И я использую методы класса для более общей работы (я изо всех сил пытаюсь описать это):

Car.numberintheworld # returns the number of cars in the world (or your program)

Вот некоторые дополнительная помощь , для вашего чтения.

0 голосов
/ 17 августа 2010

Это может дать вам лучшее разъяснение.

Когда атрибут экземпляра ссылается, что это не данные атрибут, его класс ищется. Если имя обозначает допустимый класс атрибут, который является функциональным объектом, Метод объекта создается упаковкой (указатели на) объект экземпляра и объект функции только что найден вместе в абстрактном объекте (то есть это метод объекта). Когда метод объект вызывается с аргументом список, новый список аргументов построен из объекта экземпляра и список аргументов, и объект функции вызывается с этим новый список аргументов.

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