在Python中动态设置实例属性

在Python中动态设置实例属性,python,attributes,instance,Python,Attributes,Instance,我有一个具有两个实例属性的类。例如: class Test(): def __init__(self, parameter): self.one = self.somefunction(parameter) self.two = 'somestring' 在同一个类中,我定义了一个函数somefunction,根据上面的编码,它将在创建对象时被调用。当我尝试此操作时,当我在somefunction(参数)中返回一些值时,我可以设置self.one,如:

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

class Test(): 
    def __init__(self, parameter):
        self.one = self.somefunction(parameter)
        self.two = 'somestring'
在同一个类中,我定义了一个函数somefunction,根据上面的编码,它将在创建对象时被调用。当我尝试此操作时,当我在somefunction(参数)中返回一些值时,我可以设置self.one,如:


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

除非
somefunction
需要很长时间才能返回,否则您所做的一切都没有问题。通常,您不希望对象创建/实例化花费很长时间。如果计算该属性需要很长时间,则应在第一次访问该属性时进行计算。这可以通过属性getter实现

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
。如果是,那么它将执行昂贵的函数调用。下次尝试访问它时,它将使用保存的值

有没有理由不将代码内联到init方法中?(另外,我假设你的意思是
\uuuu init\uuuu
,而不是
init
,即
测试
类的构造函数。)没有理由不把它放在init中(我更正了我的帖子)。我考虑将代码和调用方法模块化,而不是将其硬编码到init方法中。将一些初始化代码作为单独的方法并不能改进代码,因为单独的方法应该有单独调用的理由@蝙蝠侠下面的回答讨论了如何出于性能原因分离代码,而不产生单独的方法。
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)