【发布时间】:2021-07-17 08:46:57
【问题描述】:
我正在尝试创建一个具有由所有实例共享的基本属性的类,该类在初始化实例属性时用作模板。理想情况下,它将是最终的/不可变的,但这是 Python,所以我只是不打算覆盖它。
class Foo:
class_template_attr = some_resource_intensive_operation()
def __init__(self, *args, **kwargs):
self.instance_attr = method_using_class_attribute()
def method_using_class_attribute():
# determine instance_specific_extras
return self.class_template_attr + instance_specific_extras
我想避免在每次实例化新的Foo 时重新生成class_template_attr,主要是因为它是一个资源密集型操作,但也因为它应该对每个Foo 都相同,所以它应该' t被再生。高高在上,看低了,一直无法确定创建新实例时是否重新计算类属性。
如果它们被重新计算,我会假设我可以定义一个 setter 来检查 class_template_attr 是否存在,然后创建它或传递该属性(如果它已经存在)。我目前正在使用元类来执行此操作,但我想知道这是否是最 Pythonic 的事情(或者我是否一开始就做对了)。
class MetaFoo(type):
def __init__(cls, *args, **kwargs):
super.__init__(*args, **kwargs)
cls.class_template_attr = some_resource_intensive_operation()
@property
def class_template_attr(cls):
return cls.__class_template_attr
@class_template_attr.setter
def class_template_attr(cls, value):
if cls.__class_template_attr is None:
cls.__class_template_attr = value
else:
pass
def bar(input):
value = some_operation
return value
class Foo(metaclass=MetaFoo):
def __init__(self, object_specific_input):
self.instance_attr = bar(object_specific_input)
@property
def instance_attr(self):
return self.__instance_attr
@instance_attr.setter
def instance_attr(self, value):
self.__instance_attr = value
注意:我意识到实例属性的 getter/setter 在这里是多余的,但我将它们用于特定目的,我不会去为了 MRE 的缘故。
【问题讨论】:
标签: python class attributes getter-setter metaclass