как добавить методы к атрибутам класса в python? - PullRequest
1 голос
/ 31 января 2020

Я создаю пользовательский класс для хранения информации о результатах моделирования CFD.

Сейчас он настроен так, что создает экземпляр пустого объекта класса, а затем использовал метод с именем load_mesh которая вызывает внешнюю функцию, чтобы прочитать всю информацию обо мне sh и вернуть словарь всей информации. Затем метод load_mesh назначает кучу атрибутов класса из значений в словаре.

Проблема в том, что я планирую хранить гораздо больше информации, чем просто me sh, и я не хочу иметь как 1000 атрибутов для моего объекта класса. Я хочу хранить в соответствующих контейнерах (?), Каждый из которых имеет свои собственные методы.

Например, мой код выглядит следующим образом (некоторые вещи опущены, но это не нужно):

class CFD():
    def __init__(self, infile=None):
        self.file = infile

    def load_mesh(self):
        mesh = load_cfd_mesh(self) #calls outside function to load mesh info, uses self.file, returns dict
        self.proj = mesh['proj']
        self.static_items = mesh['static_items']
        self.nnodes = mesh['nnodes']
        self.node_coords = mesh['node_coords']
        self.node_codes = mesh['node_codes']
        self.nelements = mesh['nelements']
        self.element_types = mesh['element_types_str']
        self.node_connectivity = mesh['node_connectivity']
        self.element_node_ids = mesh['element_node_ids']
        self.element_coords = mesh['element_coords']
        self.element_elevs = mesh['element_elevs']
        self.horizontal_units = mesh['horizontal_units']
        self.vertical_units = mesh['vertical_units']

test = CFD('testfile.txt') #instantiate
test.load_mesh() #load mesh information to attributes

Теперь я могу получить доступ к любой информации me sh, выполнив:

test.proj
self.nnodes
self.coords

et c ...

Но хочу, чтобы я хотел это сохранить всю эту информацию в test.mesh, где test.mesh имеет все эти атрибуты, но также имеет метод test.mesh.load().

Я думаю, я могу сделать что-то вроде этого:

class CFD():
    def __init__(self, infile=None):
        self.file = infile
        self.mesh = None

    def load_mesh(self):
        mesh = load_cfd_mesh(self) #calls outside function to load mesh info, uses self.file, returns dict
        setattr(self.mesh, 'proj', mesh['proj'])
        #etc....

тогда я ' я мог бы сделать:

test = CFD('testfile.txt') #instantiate
test.load_mesh() #load mesh information to attributes
test.mesh.proj

Но я не могу понять, как добавить load_mesh метод к self.mesh?

Как можно добиться следующим образом делать это:

test = CFD('testfile.txt') #instantiate
test.mesh.load() #load mesh information to attributes
test.mesh.proj

Должен ли я определить другой класс в основном классе? Как и class mesh(self):

Кроме того, если мой предложенный способ добавления атрибутов в self.me sh не имеет смысла .., пожалуйста, помогите!

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Я думаю Вы, возможно, ищете что-то вроде свойства, чтобы лениво загружать меня sh, когда это необходимо - я действительно не понимаю, почему будет "пустой" я sh объект, который вы явно должны .load():

class Mesh:
    def __init__(self, filename):
        mesh = load_cfd_mesh(filename)
        self.proj = mesh["proj"]
        self.static_items = mesh["static_items"]
        # ...


class CFD:
    def __init__(self, filename):
        self.filename = filename
        self._mesh = None

    @property
    def mesh(self):
        if not self._mesh:
            self._mesh = Mesh(self.filename)
        return self._mesh


test = CFD("testfile.txt")
print(test.mesh.proj)
2 голосов
/ 31 января 2020

Вы можете сделать это с помощью внутреннего класса (ниже приведен упрощенный код для демонстрации):

class CFD:
    class Mesh:
        def __init__(self, file):
            self._file = file

        def load_mesh(self):
            # implement here your own code...
            print("loading from file", self._file)
            self.proj = "PROJ"

    def __init__(self, file):
        self.mesh = self.__class__.Mesh(file)
...