我有这样的课程:
class Line:
def __init__(self, text: str):
self.text = text
就我而言,一条线可以有很多features
。例如,
我可以按照类方法实现它们:
class Line:
def __init__(self, text: str):
self.text = text
def is_ascii(self):
# check and return
def is_long(self):
# check and return
def urls(self):
# find and return urls
我遇到的问题是,我需要在流程的不同阶段多次对Line对象进行方法调用(某些方法调用在计算上非常繁琐)。
我想拥有的是,在初始化时,我希望Line对象具有预填充的属性,例如is_ascii,is_long,url,以便可以多次访问它们,而无需每次访问时都进行计算。
class Line:
def __init__(self, text: str):
self.text = text
self.is_ascii = do some processing on self.text, and assign value
self.is_long = do some processing on self.text, and assign value
self.urls = do some processing on self.text, and assign value
我不确定让所有逻辑都存在于init块中是否有意义。我将如何以“ pythonic”方式实现这一目标?
您可以只拥有您要执行的方法,然后从内部调用它们__init__
:
class Line:
def __init__(self, text: str):
self.text = text
self.is_ascii = self.calc_is_ascii(self.text)
self.is_long = self.calc_is_long(self.text)
self.urls = self.calc_urls(self.text)
def calc_is_ascii(self):
# check and return
def calc_is_long(self):
# check and return
def calc_urls(self):
# find and return urls
您也可以使用它,以便在调用方法时检查方法是否已经计算出该值,并使用缓存的值,否则将对其进行计算和缓存:
class Line:
def __init__(self, text: str):
self.text = text
self.is_ascii = None
self.is_long = None
self.urls = None
def calc_is_ascii(self):
if self.is_ascii is None:
# Do expensive calculation of self.is_ascii
self.is_ascii = expensive_result
# Use the cached, previously calculated value
return self.is_ascii
# Then the same pattern for other methods
这样做的好处是,如果永远不需要其中一个属性,就不会完成计算它的工作。
我正在将属性初始化为None
。如果None
以后再来,我知道还没有计算出来。如果不是None
,我知道它们已经被计算过,因此我可以返回计算结果。当然,这None
是一个无效值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句