在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)