Python имеет что-то как анонимные внутренние классы Java?

Для других, которые Google искали эту проблему и наткнулись на этот поток, как я это сделал ...

Попробуйте: -Xlint: -deprecation

Кажется, что работает на JDK 6 ... не уверен в других.

39
задан Andrea Francia 11 December 2008 в 19:17
поделиться

6 ответов

Java использует анонимные классы главным образом для подражания закрытиям или просто блокам кода. С тех пор в Python можно легко раздать методы нет никакой потребности в конструкции, столь же неуклюжей как анонимные внутренние классы:

def printStuff():
   print "hello"

def doit(what):
   what()

doit(printStuff) 

Редактирование: я знаю, что это не то, что необходимо в этом особом случае. Я просто описал наиболее распространенное решение для Python проблемы обычно анонимными внутренними классами в Java.

18
ответ дан Joachim Sauer 23 September 2019 в 17:33
поделиться

Ну, классы являются объектами первого класса, таким образом, можно создать их в методах, если Вы хотите. например,

from optparse import OptionParser
def make_custom_op(i):
  class MyOP(OptionParser):
    def exit(self):
      print 'custom exit called', i
  return MyOP

custom_op_class = make_custom_op(3)
custom_op = custom_op_class()

custom_op.exit()          # prints 'custom exit called 3'
dir(custom_op)            # shows all the regular attributes of an OptionParser

, Но, действительно, почему не только определяют класс на нормальном уровне? Если необходимо настроить его, вставьте удовлетворение требованиям заказчика как аргументы __init__.

(редактирование: фиксированные опечатки в коде)

11
ответ дан John Fouhy 23 September 2019 в 17:33
поделиться

Можно выполнить это тремя способами:

  1. Надлежащий подкласс (конечно)
  2. пользовательский метод, который Вы вызываете с объектом как аргумент
  3. (что Вы, вероятно, хотите) - добавление нового метода к объекту (или замена существующей).

Пример опции 3 (отредактированный для удаления использования "нового" модуля - Это удерживается от использования, я не знал):

import types
class someclass(object):
    val = "Value"
    def some_method(self):
        print self.val

def some_method_upper(self):
    print self.val.upper()

obj = someclass()
obj.some_method()

obj.some_method = types.MethodType(some_method_upper, obj)
obj.some_method()
11
ответ дан gnud 23 September 2019 в 17:33
поделиться

Python, вероятно, имеет лучшие способы решить Вашу проблему. Если Вы могли бы предоставить больше определенную подробную информацию того, что Вы хотите сделать это, помог бы.

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

кроме того, так как Python является очень динамичным, можно изменить методы объекта после того, как он был создан object.method1 = alternative_impl1, хотя это на самом деле немного более сложно, см. ответ gnud

5
ответ дан Community 23 September 2019 в 17:33
поделиться

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

Однако то, о чем Вы говорите, может быть реализовано в Python с совершенно другим подходом:

class a(object):
  def meth_a(self):
    print "a"

def meth_b(obj):
  print "b"

b = a()
b.__class__.meth_a = meth_b
2
ответ дан rob 23 September 2019 в 17:33
поделиться

Python не поддерживает это непосредственно (анонимные классы), но из-за его краткого синтаксиса это не действительно необходимо:

class MyOptionParser(OptionParser):
    def exit(self, status=0, msg=None):
        # body of method

p = MyOptionParser()

Единственный недостаток - Вы, добавляют MyOptionParser к Вашему пространству имен, но как John Fouhy, на которого указывают, можно скрыть ту внутреннюю часть функция, если Вы собираетесь сделать это многократно.

6
ответ дан davidavr 27 November 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: