在Python中动态设置实例属性

问题描述 投票:0回答:1

我有一个具有两个实例属性的类。例如:

class Test(): 
    def __init__(self, parameter):
        self.one = self.somefunction(parameter)
        self.two = 'somestring'

在同一个类中,我定义了一个函数somefunction,相应于上面的编码,在创建对象时调用它。虽然我试过这个,但是当我在somefunction(参数)中返回一些值时,我可以设置self.one,如:

def somefunction(parameter):
    return ...

但是,这不是最佳实践。动态设置实例初始值的最佳方法是什么?

python attributes instance
1个回答
1
投票

除非somefunction需要很长时间才能返回,否则你所做的事情并没有错。通常,您通常不希望对象创建/实例化需要很长时间。如果计算该属性需要很长时间,则应在第一次访问该属性时执行此操作。这可以通过财产获取者来完成。

import time

class Foo(object):

    def __init__(self, parameter):
        self._one = None
        self.two = "some_string"
        self._parameter = parameter

    @property
    def one(self):
        if self._one is None:
            self.one = self._some_method()
        return self.one

    def some_method(self):
         time.sleep(10)
         return sorted(self._parameter)

当你调用foo.one时,Python会检查“protected”属性是否仍然是None。如果是,那么它将进行昂贵的函数调用。下次尝试访问它时,它将使用保存的值。

© www.soinside.com 2019 - 2024. All rights reserved.