Как обновить метод в классе в python? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь использовать 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)

, но окончательный размер окна не обновляется. Что мне не хватает? Я прошу прощения, если я не был так ясен. Мне трудно объяснить проблему, так как я никогда не программировал раньше. Спасибо!

...