如何向 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)
我正在创建自定义 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)