Python 3.x 在初始化时从单个属性初始化多个属性

Python 3.x 在初始化时从单个属性初始化多个属性,python-3.x,Python 3.x,我有这样一门课: 类行: 定义初始化(self,文本:str): self.text=文本 在我的例子中,一行可以有许多特性。比如说, 如果该行超过50个字符,则认为该行较长 如果行具有非ascii字符,则标志设置为非ascii=真 等等 查找行中的所有URL 我能够用类方法实现它们: 类行: 定义初始化(self,文本:str): self.text=文本 def是_ascii(自身): #退票 def长(自身): #退票 def URL(自): #查找并返回URL 我的问题是,我需要在过

我有这样一门课:

类行:
定义初始化(self,文本:str):
self.text=文本
在我的例子中,一行可以有许多
特性
。比如说,

  • 如果该行超过50个字符,则认为该行较长
  • 如果行具有非ascii字符,则标志设置为非ascii=真 等等
  • 查找行中的所有URL
  • 我能够用类方法实现它们:

    类行:
    定义初始化(self,文本:str):
    self.text=文本
    def是_ascii(自身):
    #退票
    def长(自身):
    #退票
    def URL(自):
    #查找并返回URL
    
    我的问题是,我需要在过程的不同阶段多次对Line对象进行方法调用(有些方法调用的计算量很大)

    我想要的是,在初始化时,我希望Line对象有一些属性,比如is_ascii,is_long,URL要预先填充,这样就可以多次访问它们,而无需每次访问时都计算它们

    类行:
    定义初始化(self,文本:str):
    self.text=文本
    self.is_ascii=对self.text进行一些处理,并赋值
    self.is_long=对self.text进行一些处理,并赋值
    self.url=对self.text进行一些处理,并赋值
    

    我不确定在init块中存在所有逻辑是否有意义。我如何以“pythonic”的方式实现这一点?

    您可以使用您所使用的方法,并从
    \uuuuuu init\uuuuu
    中调用它们:

    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
    不是有效值。

    @Carcigenicate:谢谢您的回复。如果可能的话,你能展示一下缓存是如何工作的吗?我对Python不是很精通。