我正在编写一个类来表示来自航天器的一些数据,这些数据可以提供许多不同的数据产品,这些数据可以用来计算其他变量。加载原始数据每个变量需要几秒钟,因此每个变量都应该只在需要时加载,因为并不总是需要所有变量。
这是我所指的最低限度的工作例子:
class Spacecraft:
def __init__(self, time_range, configuration='default'):
self.time_range = time_range
# Initialise all possible variables to None
self.magnetometer = None
self.temperature = None
self.complicated_thing = None
# There are 30+ of these
def get_magnetometer(self):
self.magnetometer = self.load_data('magnetometer')
return self.magnetometer
def get_temperature(self):
self.temperature = self.load_data('temperature')
return self.temperature
def get_complicated_thing(self):
# Check each variable has a value
if self.temperature is None:
get_temperature()
if self.magnetometer is None:
get_magnetometer()
self.complicated_thing = self.temperature * self.magnetometer
return self.complicated_thing
# Plus more get_ functions for each instance variable
def load_data(self, product_name):
"""Loads raw 'product_name' data as np array.
"""
pass
# Use case 1: Only need limited number of parameters
only_need_magnetometer = Spacecraft('10:30-10:45')
plot(only_need_magnetometer.get_magnetometer())
# Use case 2: Need a different set of parameters
complicated_analysis = Spacecraft('10:45-11:00')
result = analysis(complicated_analysis.get_complicated_thing())我不确定是否在__init__()中将每个变量初始化为__init__()。我也不喜欢在计算派生变量的每个函数的开头进行冗长的检查。
有没有更好的[更多的琵琶方法]?
理想情况下,我希望跳过初始化到None &能够将get_complicated_thing()定义为:
def get_complicated_thing(self):
self.complicated_thing = self.temperature * self.magnetometer
return self.complicated_thing其中,如果self.temperature或self.magnetometer还不存在,就会自动调用getter,例如get_magnetometer()。然后,可以将用例简化为:
# Use case 1: Only need limited number of parameters
only_need_magnetometer = Spacecraft('10:30-10:45')
plot(only_need_magnetometer.magnetometer)
# Use case 2: Need a different set of parameters
complicated_analysis = Spacecraft('10:45-11:00')
result = analysis(complicated_analysis.complicated_thing)至少对我来说,读起来容易多了。
发布于 2021-03-09 13:06:00
确实有一个可以使用的构造:property。有一些装饰器允许为托管属性定义getters、setters和“析构函数”。
在您的例子中,您只需要getter:
class MyClass:
def __init__(self, *args, **kwargs):
# do stuff
@property
def magnometer(self):
# do heavy calculation/loading
return result
@property
def complicated_thing(self):
# we can access self.mangometer here (it will just run the magnometer bound function)
return self.magnometer*2现在您说计算/加载操作很重。可以很容易地缓存计算出来的值如下:
from functools import cache
...
@property
@cache
def myproperty(self):
return 42
...但是,请注意,cache是在3.9中引入的,在Python3.8中有一个cached_property,您可以使用它来替代链式装饰器。或者,您可以按照this thread的方式编写自己的缓存。
附加注意:原则上,在__init__中将属性设置为__init__没有错。
https://stackoverflow.com/questions/66547220
复制相似问题