Я пытаюсь использовать python классы для определения серии методов. Это первый раз, когда я использую классы, и я новичок ie в python (и программировании в целом). В частности, у меня есть класс, который читает файл, содержащий координаты x, y и z объекта, и вычисляет минимальное и максимальное значения для x, y и z. Затем этот класс вызывает другой класс, который создает словарь {'x': ('mix_x', 'max_x') ...}, интерполирует все возможные комбинации min и max для x, y и z и возвращает поле, содержащее оригинальный объект. Этот второй класс имеет три метода:
- создание словаря,
- интерполяция min и max для создания списка кортежей (x, y, z), каждый из которых соответствует координаты вершин бокса.
- с учетом точек вершин, вычислите каждую точку ребер бокса.
Пока класс работает нормально, но сейчас я пытаюсь изменить размеры бокса , Я создал новый метод внутри второго класса, который изменяет значения min и max в словаре, так что если я применяю второй и третий метод класса к новому словарю, он должен создать новый измененный размер.
Проблема в том, что я не знаю, где вызвать новый метод и как заставить другие методы понять, что они должны использовать новый словарь для создания нового поля.
Вот как код выглядит так:
class Molecule:
def __init__(self, atoms):
self.atoms = atoms
self.extract_coords()
self.find_min_max()
def extract_coords(self):
self.coords = []
a = []
for line in self.atoms:
x = float(line[30:38])
y = float(line[38:46])
z = float(line[46:54])
a = [x, y, z]
self.coords.append(a)
def find_min_max(self):
self.min_max = {'min_x':min(x[0] for x in self.coords),
'max_x':max(x[0] for x in self.coords),
'min_y':min(y[1] for y in self.coords),
'max_y':max(y[1] for y in self.coords),
'min_z':min(z[2] for z in self.coords),
'max_z':max(z[2] for z in self.coords)}
self.bounding_box = BoundingBox(self.min_max)
class BoundingBox:
def __init__(self, min_max):
self.min_max = min_max
self.calc()
self.calc_coords()
self.calc_edges()
def calc(self):
self.bounding_box = {"x": (self.min_max['min_x'], self.min_max['max_x']),
"y": (self.min_max['min_y'], self.min_max['max_y']),
"z": (self.min_max['min_z'], self.min_max['max_z'])}
def calc_coords(self):
self.coords = []
for x in self.bounding_box["x"]:
for y in self.bounding_box["y"]:
for z in self.bounding_box["z"]:
self.coords.append( [x,y,z] )
import sys
f = read_file(sys.argv[1])
atoms = extract_atoms(f)
mol = Molecule(atoms)
Теперь я пытаюсь использовать этот новый метод:
def resize(self, value):
for k,v in self.bounding_box.items():
_min, _max = v
size = (_max - _min) / (value)
_min = _min + (size/2)
_max = _max - (size/2)
self.bounding_box[k] = (_min, _max)
, который должен обновить self.bounding_box с новым минимумом, максимумом. Я вызываю этот метод следующим образом:
import sys
f = read_file(sys.argv[1])
atoms = extract_atoms(f)
mol = Molecule(atoms)
mol.bounding_box.resize(3)
, но окончательный размер окна не обновляется. Что мне не хватает? Я прошу прощения, если я не был так ясен. Мне трудно объяснить проблему, так как я никогда не программировал раньше. Спасибо!