【问题标题】:Python object properties with docstrings from a dict带有来自字典的文档字符串的 Python 对象属性
【发布时间】:2016-03-06 00:25:26
【问题描述】:

在我的对象的初始化中,我想从一个可迭代对象中创建对象属性。例如:

class MyClass(object):
    def __init__(self, parameters):
        attributes = ['name',
                      'memory',
                      'regressors',
                      'use_const']
        for attr_name in attributes():
            try:
                attr_val = parameters[attr_name]
            except KeyError:
                raise Error("parameters must contain {}".format(attr_name))
            setattr(self, attr_name, attr_val)

这让我得到我想要的属性。但是,与定义相比,我失去了什么

@property
def name(self):
    """str: This class' name"""
    return self._name

是我现在没有得到属性的文档字符串。

我想要每个属性的文档字符串(用于我的自动生成的文档),但我也想使用可迭代的而不是必须单独定义每个属性。比如可以把attributes转成以docstring为值的dict,动态设置属性的docstring吗?

我的蛋糕也可以吃吗?

【问题讨论】:

    标签: python python-2.7 oop object


    【解决方案1】:

    您只能在上设置property 对象。您可以在循环中执行此操作,但这必须在构建类时完成,而不是实例。

    只需生成property 对象:

    def set_property(cls, name, attr, docstring):
        def getter(self):
            return getattr(self, attr)
        prop = property(getter, None, None, docstring)
        setattr(cls, name, prop)
    
    for name in attributes:
        attr = '_' + name
        docstring = "str: This class' {}".format(name)
        set_property(SomeClass, name, attr, docstring)
    

    【讨论】:

    • 这种方法的难点是我想在类级别执行set_property 循环,但是在那个级别没有定义类的名称......在类定义之外执行它会当我进行导入时不要让它运行。我正在考虑使用here 描述的元类,但您还有其他想法吗?
    • @A.Wan:当然,它会在您导入定义的模块时运行。class 语句也只是当时运行的代码。
    猜你喜欢
    • 2021-10-17
    • 2010-09-08
    • 1970-01-01
    • 2019-10-12
    • 2021-04-06
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多