【发布时间】:2020-01-31 13:44:44
【问题描述】:
我正在创建一个自定义类来存储有关 CFD 模拟结果的信息。
现在它的设置方式是它实例化一个空的类对象,然后使用一个名为load_mesh的方法,它调用一个外部函数来读取关于网格的所有信息,并返回一个包含所有信息的字典. load_mesh 方法然后从字典中的值分配一堆类属性。
问题是我计划存储比网格更多的信息,而且我不希望我的类对象有 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 mesh(self):
另外,如果我提出的向 self.mesh 添加属性的方法没有意义..请帮忙!
【问题讨论】:
-
您想用具有属性的类替换字典?除了一点可读性,我不会推荐这个。坚持使用字典:这是一个非常好的数据结构。不要仅仅因为
mydata.some_key看起来比mydata['some_key']好一点就强行把它放到一个类中。 -
好的,不管我如何将信息存储在
self.mesh中,我如何向其中添加load方法,主要问题是添加方法 -
@00 不,
class CFD():很好,如果看起来有点奇怪。 -
最后我可以做
self.mesh['proj']如果我愿意,但是我如何通过调用self.mesh.load()来加载网格信息 -
@chepner 实际上还有更多内容我只是为了问题的极简主义而删除了它......应该删除括号,但无论如何
标签: python class inner-classes