Я создал объект Atom следующим образом:Выбор объектов
class Atom(object):
def __init__(self, symbol, x, y, z)
self.symbol = symbol
self.position = (x, y, z)
и Selection
класс, который содержит атомы, выбранные по некоторым критериям:
class Selection(object):
def __init__(self, a_system, atom_list=[]):
for atom in a_system:
atom_list.append(atom)
self.atom_list = atom_list
def by_symbol(self, symbol):
r_list = []
for atom in self.atom_list:
if atom.symbol is symbol:
r_list.append(atom)
self.atom_list = r_list
def by_zrange(self, zmin, zmax):
r_list = []
for atom in self.atom_list:
pos = atom.position[2]
if pos > zmin and pos < zmax:
r_list.append(atom)
self.atom_list = r_list
Так как вы можете видеть, что я могу сказать, например, :
# my_system is a list of atoms objects
group = Selection(my_system)
, а затем сказать:
group.by_symbol('H')
и у меня в объекте group
все атомы водорода. Тогда, если я:
group.by_zrange(1, 2)
и я буду иметь в объекте group
всех атомы водорода, которые имеют Z-координату между 1 и 2.
У меня есть другие критерии отбора, но в целом они все равно структура, чтобы узнать:
r_list = []
for atom in self.atom_list:
# Some criteria here
r_list.append(atom)
self.atom_list = r_list
Итак, вопрос: есть ли что-то я могу сделать для того, чтобы избежать написания выше структуру для каждого критерия отбора?
Если вы знаете, что есть более простой способ выполнить мою задачу, я буду рад услышать это.
* ВНИМАНИЕ *: Вы поставили изменяемый аргумент по умолчанию для 'Выбор .__ INIT __ (atom_list)', это, вероятно, чтобы сделать вашу жизнь трудной. – SingleNegationElimination
Спасибо, но почему? Любая информация, которую я могу использовать, чтобы узнать об этом? – ezitoc
да, см. Этот вопрос: http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument – SingleNegationElimination