【问题标题】:Setting attribute for class object in python that is slow to load在python中为加载缓慢的类对象设置属性
【发布时间】:2020-12-02 19:03:39
【问题描述】:

我正在尝试创建一个视频对象列表,这些对象具有在启动时设置的名称属性,然后是其他属性。从 ffprobe 调用获取元数据加载。 ffmpeg 调用运行起来明显比较慢,所以我写了这个类如下:

class Video:

    def __init__(self, path, name):
        self.name = name
        self.path = path

    def get_length(self):
        if self.length:
            return self.length
        else:
            self.length = slow_function()
        return self.length

这样我就可以在需要引用 attr 的时间点获取属性,并且在“get”调用中该值是“set”。

这是正确的方法吗?有没有更好的办法?

谢谢。

【问题讨论】:

    标签: python oop


    【解决方案1】:

    稍微干净一点的方法是将self.length初始化为None,然后如果self.length仍然是None,则调用慢速函数

    class Video:
    
        def __init__(self, path, name):
            self.name = name
            self.path = path
            self.length = None
    
        def get_length(self):
            if self.length is None:
                self.length = slow_function()
    
            return self.length
    

    这种延迟定义的属性通常使用property 来实现。

    class Video:
    
        def __init__(self, path, name):
            self.name = name
            self.path = path
            self._length = None
    
        @property
        def length(self):
            if self._length is None:
                self._length = slow_function()
    
            return self._length
    

    现在您可以访问 length 作为常规(虽然是只读)属性

    v = Video(...)
    print(v.length)
    

    而不是显式的方法调用。

    【讨论】:

    • 哦,有趣,在这里学到了一些新东西。我想有一个特殊的属性函数装饰器是的。感谢您的提示!
    猜你喜欢
    • 2016-02-25
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多