首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态更改__slots__

动态更改__slots__
EN

Stack Overflow用户
提问于 2012-05-31 02:31:01
回答 3查看 1.8K关注 0票数 3

我正在处理一个类,它需要通过__init__注入获得它的__dict__属性,如下所示:

代码语言:javascript
复制
class Torrent(Model):
    def __init__(self, d):
        super(Torrent, self).__init__('torrents')
        self.__dict__ = d

并且需要确保不改变对象的结构,因为实例将在NOSQL数据库中结束。我认为__slots__可能会有所帮助,但我需要动态地定义它。

有没有一种方法可以在没有元类的情况下实现呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-31 02:41:52

使用工厂函数:

代码语言:javascript
复制
def GetTorrentClass(slots_iterable):
    class Torrent(object):
        __slots__ = slots_iterable
    return Torrent

请注意,要使用插槽:

  • slots_iterable必须是一个可迭代的字符串
  • 你的类必须是新型的
  • 你的类不能继承实现__dict__的类(即.这不仅仅是__slots__的问题)

现在,你说你“需要确保不改变对象的结构”,使用__slots__不是你问题的唯一解决方案(可能也不是最好的):使用插槽会让你的类更难在代码中使用。

相反,您可以执行以下操作:

代码语言:javascript
复制
class Torrent(object):
    def __init__(self, fields):
        self.fields = fields #Fields could be ('field1', 'field2')

    def save(self):
        for field in self.fields:
            self.store_to_db(field, getattr(self, field))

这样,您就可以确定只有您的实际字段才会保存到数据库中。

票数 7
EN

Stack Overflow用户

发布于 2012-05-31 02:42:05

这应该会产生你所需要的魔力。

代码语言:javascript
复制
def construct_slots(slots):
    class SlotClass(object):
        __slots__ = slots
        def __init__(self, *args, **kwargs):
            for slot, arg in zip(SlotClass.__slots__, args):
                setattr(self, slot, arg)
            for key, value in kwargs:
                setattr(self, key, value)
    return SlotClass

Torrent = construct_slots(("a",'b','c'))
a = Torrent(1,2,3)
print a.a
print a.b
票数 3
EN

Stack Overflow用户

发布于 2012-05-31 02:41:40

__slots____dict__通常是可选的。在这两种情况下,元类都不能帮助您为实例动态创建它们,除了自定义元类可以放宽对__dict__赋值的限制(Django已经做到了这一点)。

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

https://stackoverflow.com/questions/10822154

复制
相关文章

相似问题

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