2016-05-26 4 views
5

В чем преимущества использования методов типов из модуля типов. Он используется для добавления методов к объекту. Но мы можем сделать это легко и без него:Преимущество использования метода метода в Python

def func(): 
    print 1 

class A: 
    pass 

obj = A() 
obj.func = func 

Это работает, даже если мы удалим FUNC в основном объеме с помощью del func.

Зачем нужно использовать методы? Это просто конвенция или хорошая привычка к программированию?

+1

На самом деле это не добавление метода к 'obj'. 'obj.func()' такой же, как вызов только 'func()'. Метод получает экземпляр как 1. позиционный аргумент. Вы можете создать связанный метод с 'func .__ get __ (obj, A)', но это тоже не сработает, так как 'func' не принимает аргументов. –

+0

Ваша функция 'func' не имеет аргумента' self'. Вы используете 'type', если хотите присоединить или заменить метод * класса. Здесь вы просто присоединяете * функцию * к классу. – Cyrbil

ответ

3

На самом деле разница между методами добавления динамически во время выполнения и ваш пример огромен:

  • в вашем случае, вы просто прикрепить функцию к объекту, вы можете назвать это, конечно, но это несвязанного, это не имеет никакого отношения к самому объекту (то есть. вы не можете использовать self внутри функцию)
  • при добавлении с MethodType, нужно создать метод связанного и он ведет себя как обычный метод Python для объекта, вы должны принять объект он принадлежит в качестве первого аргумента (обычно он называется self), и вы можете получить доступ к нему внутри функции

Этот пример показывает разницу:

def func(obj): 
    print 'I am called from', obj 
class A: 
    pass 
a=A() 
a.func=func 
a.func() 

Это терпит неудачу с TypeError: func() takes exactly 1 argument (0 given), в то время как этот код работает, как ожидалось:

import types 
a.func = types.MethodType(func, a, A) 
a.func() 

шоу I am called from <__main__.A instance at xxx>.

+0

Итак, это означает, что я не смогу использовать атрибуты объекта, с которым я использовал это. Например, если бы был атрибут, скажем, 'att' в моем определении, то я бы не смог его правильно использовать? – Existent

+0

В вашем случае в вашем вопросе функция отключена от объекта. Невозможно получить доступ к объекту из функции, потому что функция вообще не является методом. – mguijarr

+0

@ABHI нет, 'att' можно получить из любого места, но вам нужен экземпляр класса для доступа к нему (т. Е.' Att' сам по себе ничего не значит, вам нужно 'obj.att'). Методы, определенные обычно (и поэтому связаны), получают «self'argument», который является экземпляром, к которому привязан метод, и поэтому у них есть простой способ добраться до соответствующего «att». –

3

Общее использование types.MethodType проверяет, является ли какой-либо объект методом. Например:

>>> import types 
>>> class A(object): 
...  def method(self): 
...   pass 
... 
>>> isinstance(A().method, types.MethodType) 
True 
>>> def nonmethod(): 
...  pass 
... 
>>> isinstance(nonmethod, types.MethodType) 
False 

Обратите внимание, что в вашем примере isinstance(obj.func, types.MethodType) возвращает False. Представьте, что вы определили метод meth в классе A. isinstance(obj.meth, types.MethodType) вернется True.

 Смежные вопросы

  • Нет связанных вопросов^_^