gpt4 book ai didi

python - 将属性关联到类对象

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:24 25 4
gpt4 key购买 nike

我想为类定义属性,并能够在实际实例化该类的对象之前访问它们。

我会给出一些上下文。我的应用程序处理组件库。每个组件都映射到一个 Python 类。现在我想知道在实际实例化类之前组件需要什么配置。

一个解决方案是这样写:

class Component:
@classmethod
def config(cls, name, description, default=None):
''' Define one configuration switch for the class. '''
# now put this information in a class-specific dictionary

class Model1(Component):
@classmethod
def define_configuration(cls):
cls.config('n', 'number of burzs to instigate')
cls.config('skip', 'skip any barzs among the burzs', default=True)
# ...

component_class = Model1
component_class.define_configuration()

然而,它看起来很丑陋。理想情况下,我希望能够编写如下内容,并且仍然能够将配置开关放在特定于类的字典中,以便稍后访问。

class Model1(Component):
config('n', 'number of burz to instigate')
config('skip', 'skip any barz in the data', default=True)

我最初的解决方案是这样写:

class Model1(Component):
Model1.config('n', 'number of burz to instigate')
Model1.config('skip', 'skip any barz in the data', default=True)

但是我在 SO 上的其他问题上发现执行主体时尚未定义类名。

我该怎么办?

tl;dr:如何获得用于定义类特定属性的良好语法(在实例化该类的对象之前)?


这是(为了记录)建议的解决方案(稍微详细说明)。呀!我可以得到我想要的。 :-)

from collections import namedtuple
Config = namedtuple('Config', 'name desc default')

def config(name, description, default=None):
ComponentMeta.tmp_config_storage.append(Config(name, description, default))

class ComponentMeta(type):
tmp_config_storage = []
def __init__(cls, clsname, bases, clsdict):
for config in ComponentMeta.tmp_config_storage:
if not 'my_config' in cls.__dict__:
setattr(cls, 'my_config', [])
cls.my_config.append(config)
ComponentMeta.tmp_config_storage = []

class Component(object):
__metaclass__ = ComponentMeta

class Model1(Component):
config('x1', 'for model1')
config('y1', 'for model1')

class Model2(Component):
config('x2', 'for model2')

print 'config for Model1:', Model1.my_config
print 'config for Model2:', Model2.my_config

最佳答案

更正

def config(name, description, default=None):
ComponentMeta.config_items.append((name, description, default))

class ComponentMeta(type):
config_items = []
def __init__(cls, clsname, bases, clsdict):
for options in ComponentMeta.config_items:
cls.add_config(*options)
ComponentMeta.config_items = []

class Component(object):
__metaclass__ = ComponentMeta
config_items = [] # this is only for testing. you don't need it
@classmethod
def add_config(cls, name, description, default=None):
#also for testing
cls.config_items.append((name, description, default))

class Model1(Component):
config('n', 'number of burz to instigate')
config('skip', 'skip any barz in the data', default=True)

print Model1.config_items

这通过使配置成为将项目添加到 ComponentMeta.config_instances 的外部函数来实现。 ComponentMeta 然后在创建类时检查此列表并在项目上调用 config_item。请注意,这不是线程安全的(尽管我可以这样做)。此外,如果 ComponentMeta 的子类无法调用 super 或清空 ComponentMeta.config_items 本身,下一个创建的类将获得配置项。

关于python - 将属性关联到类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com