在初始化时从单个属性初始化多个属性

对手

我有这样的课程:

class Line:
    def __init__(self, text: str):
        self.text = text

就我而言,一条线可以有很多features例如,

  1. 如果该行超过50个字符,则认为该行很长。
  2. 如果该行包含非ASCII字符,则将标志设置为non_ascii = True,依此类推
  3. 查找该行中的所有网址

我可以按照类方法实现它们:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift中的惰性属性初始化

来自分类Dev

列表属性的初始化语法

来自分类Dev

驼鹿属性初始化

来自分类Dev

惯用方法初始化弱属性?

来自分类Dev

CommandText属性未初始化

来自分类Dev

连接属性尚未初始化

来自分类Dev

连接属性错误尚未初始化

来自分类Dev

属性的继承和初始化

来自分类Dev

初始化AUGraph后的AVAudioSession属性

来自分类Dev

Python类属性及其初始化

来自分类Dev

Dapper:ConnectionString属性尚未初始化

来自分类Dev

自动属性何时初始化?

来自分类Dev

获取和设置属性的初始化

来自分类Dev

在没有初始化的情况下进行结构初始化时的Swift初始化属性

来自分类Dev

python 3.8-在初始化时动态设置类的属性

来自分类Dev

lateinit属性的性别尚未初始化

来自分类Dev

创建属性并使用数组元素初始化时发生TypeError

来自分类Dev

初始化集合中的属性

来自分类Dev

属性初始化Java

来自分类Dev

C#中的属性初始化

来自分类Dev

Swift中的惰性属性初始化

来自分类Dev

初始化对象的列表属性

来自分类Dev

Castle DynamicProxy自动属性初始化

来自分类Dev

通过private属性初始化属性

来自分类Dev

初始化共享属性的值

来自分类Dev

Javascript对象属性初始化

来自分类Dev

初始化Python属性

来自分类Dev

是否可以在初始化时直接改变属性/变量?

来自分类Dev

自定义依赖属性未在初始化时设置