2016-01-25 6 views
1

может ли быть какие-либо проблемы, которые могут возникнуть с использованием методов класса непосредственно на созданный экземпляр как это ?:Можно ли создать экземпляр класса python без назначения экземпляра переменной?

TmpClass('lol').printx() 

пример Класс для справки:

class TmpClass: 
     def __init__(self, x): 
      self.x = x 

     def printx(self): 
      print self.x 
+1

Почему бы и нет, если это то, что вы намереваетесь сделать? Если вы не собираетесь использовать экземпляр позже, то почему вы должны назначить его переменной? Я бы даже сказал, что назначение его переменной будет ошибочным, и любая спускаемая IDE будет выделять переменную как неиспользованную. –

+0

Избегайте использовать что-то вроде res = TmpClass ('lol'). Printx(). 'lol' будет напечатан, но res будет None. – Farseer

+0

@Eli Korvigo, я новичок в python, но пытаюсь улучшить. Исходя из C, я принимаю с осторожностью все, что кажется мне неинтуитивным. В этом случае я не мог найти информацию в Интернете самостоятельно. – user1308345

ответ

0

Если вы делаете MyClass('a').my_method(), например, в цикле, вы дадите сборщику мусора много работы.

Вот пример использования IPython conslole

In [11]: class Asdf(object): 
    ....:  def __init__(self, x): 
    ....:   self.x = x 
    ....:  def printx(self): 
    ....:   pass 
    ....:  

In [12]: def asdf(x): 
    ....:  pass 
    ....: 

In [13]: %timeit Asdf(9).printx() 
The slowest run took 14.89 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 272 ns per loop 

In [14]: %timeit asdf(9) 
10000000 loops, best of 3: 56.9 ns per loop 

Как вы можете видеть, это занимает много времени, чтобы создать экземпляр и очистить созданные объекты, по сравнению с просто вызовом функции. Теперь в некоторых случаях просто вызов функции недостаточно или подходит. Но это всего лишь мои 2 цента, касающиеся конкретно проблемы с производительностью.

Стоит отметить: я исключил печать из функции/метода. Если я оставил печать, результаты выглядят совсем иначе:

Для экземпляра класса я получил 100000 loops, best of 3: 7.42 µs per loop и для вызова функции 100000 loops, best of 3: 7.4 µs per loop.

Это просто, чтобы показать, что иногда небольшие улучшения в производительности приводят к смехотворным небольшим улучшениям.

0

Это зависит.

Если вы хотите использовать этот объект только один раз, это не проблема. Проблема может возникнуть, если вы создадите так много анонимных объектов вместо имени одного, что ваша программа будет неэффективной и потребляет много памяти.

Это та же история, что и функции и лямбда-выражения.

+0

«Анонимные объекты», как и объекты, без каких-либо оставшихся ссылок на них, обычно очищаются сборщиком мусора, что означает, что они не будут потреблять память. – TigerhawkT3

+0

Да, но вы все равно должны их создавать, что требует времени и памяти. – PatNowak

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