Вы можете следовать шаблону синглтона. По сути, вы хотите создать один глобальный список, к которому вы можете получить доступ из любого места. Вы могли бы поместить это в нескольких местах, я бы предложил расширить 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 ...
}
}
, так как я программист на Java ... я думаю ... это перегрузка оператора? Person.name == - перегруженный оператор, который вместо этого выполняет сравнение ... он создает запрос SQL
my 0.02 $
Person.name
имеет перегруженный метод __eq __
, который возвращает не логическое значение, а объект, который хранит обе стороны выражения; этот объект можно проверить методом find ()
, чтобы получить атрибут и значение, которые он будет использовать для фильтрации. Я бы описал это как тип ленивого шаблона оценки.
В Storm он реализован с помощью объекта Comparable
.
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
Это, конечно, обход края «слишком умного», поэтому я будьте очень осторожны с использованием этого в производственном коде. Явная лямбда, вероятно, будет намного понятнее будущим сопровождающим, даже если она будет более многословной.
Магия находится в свойстве Person.name, в результате чего в типе, который перегружает __eq __
(& c) для возврата не bools. Вы можете просмотреть исходные тексты Storm (и ВНИМАТЕЛЬНО подражать ;-) на http://bazaar.launchpad.net/~storm/storm/trunk/files/head%3A/storm/ - как вы увидите, они не освещают "черную магию"; -)
Это не похоже на лямбду питона для меня. Я не читал код для Storm, но Майлз, вероятно, прав в том, что он использует ленивую схему оценки.
Чтобы узнать больше о лямбда-функциях Python, прочитайте превосходную главу из Dive Into Python .