如何向 python 中的 class 属性添加方法?

how to add methods to class attributes in python?

我正在创建自定义 class 来存储有关 CFD 模拟结果的信息。

现在它的设置方式是实例化一个空的 class 对象,然后使用一个名为 load_mesh 的方法调用外部函数来读取有关网格的所有信息, return 所有信息的字典。 load_mesh 方法然后从字典中的值中分配一堆 class 属性。

问题是我计划存储比网格更多的信息,而且我不希望我的 class 对象有 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

现在,我可以通过以下方式访问任何网格信息:

test.proj
self.nnodes
self.coords

等...

但我想做的是将所有这些信息存储在 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 中定义另一个 class?喜欢class mesh(self):

此外,如果我提出的向 self.mesh 添加属性的方法没有意义..请帮忙!

认为 你可能正在寻找类似 属性 的东西来在需要时延迟加载网格——我真的不明白为什么会有"empty" 您明确必须 .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)

您可以使用内部 class 来做到这一点(下面是用于演示的简化代码):

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)