首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向python类添加属性

向python类添加属性
EN

Stack Overflow用户
提问于 2015-07-23 14:11:53
回答 1查看 4.2K关注 0票数 5

考虑以下代码:

代码语言:javascript
复制
class Foo():

    pass


Foo.entries = dict()


a = Foo()
a.entries['1'] = 1

b = Foo()
b.entries['3'] = 3

print(a.entries)

这将打印:

代码语言:javascript
复制
{'1': 1, '3': 3}

因为条目是作为静态属性添加的。是否存在猴子修补类定义以添加新属性(不使用继承)的方法。

我设法找到了以下方法,但在我看来,这似乎很复杂:

代码语言:javascript
复制
def patch_me(target, field, value):
    def func(self):
        if not hasattr(self, '__' + field):
            setattr(self, '__' + field, value())
        return getattr(self, '__' + field)
    setattr(target, field, property(func))

patch_me(Foo, 'entries', dict)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-23 14:20:22

通常,属性是通过__init__()函数或实例化后添加的:

代码语言:javascript
复制
foo = Foo()
foo.bar = 'something'  # note case

如果您想要自动完成此操作,则继承是迄今为止最简单的方法:

代码语言:javascript
复制
class Baz(Foo):
    def __init__(self):
        super().__init__()  # super() needs arguments in 2.x
        self.bar = 'something'

注意,类不需要出现在Python模块的顶层。您可以在函数中声明一个类:

代码语言:javascript
复制
def make_baz(value):
    class Baz(Foo):
        def __init__(self):
            super().__init__()  # super() needs arguments in 2.x
            self.bar = value()
    return Baz()

此示例将在每次调用make_baz()时创建一个新类。这可能是你想要的,也可能不是你想要的。这样做可能会更简单:

代码语言:javascript
复制
def make_foo(value):
    result = Foo()
    result.bar = value()
    return result

如果您真的打算对原始类进行猴子修补,那么您提供的示例代码或多或少是最简单的方法。您可能会考虑为property()使用修饰器语法,但这是一个小变化。我还应该指出,它不会调用双下划线名称mangling,这可能是一件好事,因为它意味着您不能与类本身使用的任何名称发生冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31589927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档