【问题标题】:Python __Slots__ (Making and Using)Python __Slots__ (制作和使用)
【发布时间】:2013-01-17 22:28:32
【问题描述】:

我真的没有上课,使用__slots__ 有人可以说得更清楚吗?

例如,我正在尝试创建两个类,一个是空的,另一个不是。到目前为止我得到了这个:

class Empty:
    __slots__ =()

def mkEmpty():
    return Empty()

class NonEmpty():
    __slots__ = ('one', 'two')

但我不知道如何制作“mkNonEmpty”。我也不确定我的 mkEmpty 函数。

谢谢

编辑:

这就是我最终的结果:

class Empty:
    __slots__ =()

def mkEmpty():
    return Empty()

class NonEmpty():
    __slots__ = ('one', 'two')

def mkNonEmpty(one,two):
    p = NonEmpty()
    p.one= one
    p.two= two
    return p

【问题讨论】:

    标签: python class slots


    【解决方案1】:

    然后您必须以传统方式初始化您的类。它会像这样工作:

    class Empty:
        __slots__ =()
    
    def mkEmpty():
        return Empty()
    
    class NonEmpty():
        __slots__ = ('one', 'two')
    
        def __init__(self, one, two):
            self.one = one
            self.two = two
    
    def mkNonEmpty(one, two):
        return NonEmpty(one, two)
    

    实际上,构造函数是非必要的和非pythonic的。您可以并且应该直接使用类构造函数,如下所示:

    ne = NonEmpty(1, 2)
    

    如果您需要某种记录,您也可以使用空构造函数并直接在应用程序中设置插槽

    class NonEmpty():
        __slots__ = ('one', 'two')
    
    n = NonEmpty()
    n.one = 12
    n.two = 15
    

    您需要了解,只有出于性能/内存原因才需要插槽。您不需要使用它们,也可能不应该使用它们,除非您知道您的内存受限。不过,这应该只是在实际遇到问题之后。

    【讨论】:

    • 谢谢,这很有帮助。你介意看看我的编辑并告诉我它是否可以吗?
    • 很好用。你有什么特别的理由使用函数来初始化你的对象而不是像我的例子中的类构造函数吗?
    • 是的,我们必须以“愚蠢”的方式进行操作sigh这是为了实验室。
    【解决方案2】:

    也许the docs 会有所帮助?老实说,听起来你并不需要担心__slots__

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 2018-02-16
      • 1970-01-01
      • 2010-10-03
      • 2021-04-08
      • 2012-12-24
      • 2010-10-23
      • 2017-11-13
      相关资源
      最近更新 更多