какая функция Python проиллюстрирована в этом коде?

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

У вас может быть свой Application, но если нет, вам также нужно зарегистрировать его в своем манифесте.

Итак, я создал приложение под названием MyApp, которое происходит от Application. Он будет содержать список ответов, к которым мы можем получить доступ из любого места.

public class MyApp extends Application {

    // A public static list of answers
    public static ArrayList<answers_preview_data> answers = new ArrayList<>();

    @Override
    public void onCreate() {
        super.onCreate();
        // do other app setup ...
    }
}

Теперь, в ваших вопросах, мы можем легко добавить новый ответ в этот список.

public class QuestionOne extends AppCompatActivity implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        // Adding the new answer to your list.
        MyApp.answers.add(new answers_preview_data());
    }

}

А внутри вашего класса оценки мы можем получить список и использовать его локально.

public class Grade extends AppCompatActivity {

    private ArrayList<answers_preview_data> mPreviewArrayList;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPreviewArrayList = MyApp.answers;
        // use your list ...
    }
}
5
задан Jon Seigel 18 May 2010 в 01:51
поделиться

5 ответов

, так как я программист на Java ... я думаю ... это перегрузка оператора? Person.name == - перегруженный оператор, который вместо этого выполняет сравнение ... он создает запрос SQL

my 0.02 $

0
ответ дан 18 December 2019 в 05:21
поделиться

Person.name имеет перегруженный метод __eq __ , который возвращает не логическое значение, а объект, который хранит обе стороны выражения; этот объект можно проверить методом find () , чтобы получить атрибут и значение, которые он будет использовать для фильтрации. Я бы описал это как тип ленивого шаблона оценки.

В Storm он реализован с помощью объекта Comparable .

22
ответ дан 18 December 2019 в 05:21
поделиться

Person.name является экземпляром некоторого типа с пользовательским методом __eq __ . Хотя __eq __ обычно возвращает логическое значение (ish), на самом деле он может возвращать все, что вы хотите, включая лямбду. См. Имена специальных методов Python для получения дополнительной информации об этом и связанных с ним методах.

Вероятно, наиболее запутывающей / вводящей в заблуждение частью этого (особенно если вы привыкли к другим языкам OO, таким как Java) является то, что Person.name и person.name (где person является экземпляром Person ) не должны иметь никакого отношения друг к другу. Например:

class Person(object):
  name = "name of class"
  def __init__(self):
    self.name = "name of instance"

person = Person()
print Person.name
print person.name

Это напечатает:

 название класса
имя экземпляра

Обратите внимание, что свойство класса просто задается в теле класса, а свойство экземпляра устанавливается в методе __ init __ .

В вашем случае вы должны установить Person.name к объекту с помощью пользовательского метода __eq __ , который возвращает лямбду, что-то вроде этого:

class LambdaThingy(object):
  def __init__(self, attrname):
    self.__attrname = attrname

  def __eq__(self, other):
    return lambda x: getattr(x, self.__attrname) == other

class Person(object):
  name = LambdaThingy('name')

  def __init__(self, name):
    self.name = name

equals_fred = Person.name == "Fred"
equals_barney = Person.name == "Barney"

fred = Person("Fred")

print equals_fred(fred)
print equals_barney(fred)

Это печатает:

True
False

Это, конечно, обход края «слишком умного», поэтому я будьте очень осторожны с использованием этого в производственном коде. Явная лямбда, вероятно, будет намного понятнее будущим сопровождающим, даже если она будет более многословной.

9
ответ дан 18 December 2019 в 05:21
поделиться

Магия находится в свойстве Person.name, в результате чего в типе, который перегружает __eq __ (& c) для возврата не bools. Вы можете просмотреть исходные тексты Storm (и ВНИМАТЕЛЬНО подражать ;-) на http://bazaar.launchpad.net/~storm/storm/trunk/files/head%3A/storm/ - как вы увидите, они не освещают "черную магию"; -)

8
ответ дан 18 December 2019 в 05:21
поделиться

Это не похоже на лямбду питона для меня. Я не читал код для Storm, но Майлз, вероятно, прав в том, что он использует ленивую схему оценки.

Чтобы узнать больше о лямбда-функциях Python, прочитайте превосходную главу из Dive Into Python .

1
ответ дан 18 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

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