Python __slots__不适用于某个类声明

问题描述 投票:0回答:2

当我在python中声明类时,就像下面的插槽工作一样

class CSStudent(object):
stream = 'cse'
__slots__ = ['name', 'roll']

def __init__(self, name, roll):
    self.name = name
    self.roll = roll

当我在python中声明类时,下面的插槽不起作用

   class CSStudent:
stream = 'cse'
__slots__ = ['name', 'roll']

def __init__(self, name, roll):
    self.name = name
    self.roll = roll
python python-2.7
2个回答
1
投票

__slots__属性仅适用于“新式”类(它们不是真正的“新”类,它们在15年前的Python 2.2中出现)。在Python 2中,如果从object(或其他一些新式类)继承,则只能获得一个新式类。通过在class语句中的派生类名称后面的括号中放置一个或多个基类来声明继承。因此,CSStudent的第二个实现不是新式类,因为它不会从任何东西继承。因此__slots__将无法工作(它只是一个奇怪的命名属性)。

新样式和旧样式类之间的区别仅存在于Python 2上.Python 3已经删除了旧式类,因此两个类实现在Python 3解释器中的工作方式相同(不再需要显式继承) object)。


1
投票

似乎有两件事触发了你的错误:

首先,class声明中缺少括号。

其次,你的缩进是不合时宜的。每个新代码块有四个空格。

class CSStudent(object):
    stream = 'cse'
    __slots__ = ['name', 'roll']

    def __init__(self, name, roll):
        self.name = name
        self.roll = roll 

user247=CSStudent('user247',2018)

print user247.name,' | ',user247.roll

当你运行它,工作得很好:

$ chmod +x /tmp/slots_test.py 
$ /tmp/slots_test.py 
user247  |  2018
© www.soinside.com 2019 - 2024. All rights reserved.