在 Python 中动态设置实例属性
Dynamically set instance attribute in Python
我有一个带有两个实例属性的 class。例如:
class Test():
def __init__(self, parameter):
self.one = self.somefunction(parameter)
self.two = 'somestring'
在同一个 class 中,我定义了一个函数 somefunction,根据上述编码,该函数将在创建对象时被调用。当我尝试这个时,我可以设置 self.one 当我 return 我的 somefunction(parameter) 中的一些值时,例如:
def somefunction(parameter):
return ...
但是,这并不是最好的 practice.What 动态设置实例初始值的最佳方式?
你所做的没有错,除非 somefunction
需要很长时间才能 return。通常,您通常不希望对象 creation/instantiation 花费很长时间。如果计算该属性需要很长时间,您应该在第一次访问该属性时进行计算。这可以用 属性 吸气剂来完成。
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
。如果是,then 它将执行昂贵的函数调用。下次您尝试访问它时,它将使用保存的值。
我有一个带有两个实例属性的 class。例如:
class Test():
def __init__(self, parameter):
self.one = self.somefunction(parameter)
self.two = 'somestring'
在同一个 class 中,我定义了一个函数 somefunction,根据上述编码,该函数将在创建对象时被调用。当我尝试这个时,我可以设置 self.one 当我 return 我的 somefunction(parameter) 中的一些值时,例如:
def somefunction(parameter):
return ...
但是,这并不是最好的 practice.What 动态设置实例初始值的最佳方式?
你所做的没有错,除非 somefunction
需要很长时间才能 return。通常,您通常不希望对象 creation/instantiation 花费很长时间。如果计算该属性需要很长时间,您应该在第一次访问该属性时进行计算。这可以用 属性 吸气剂来完成。
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
。如果是,then 它将执行昂贵的函数调用。下次您尝试访问它时,它将使用保存的值。