Python __slots__不适用于某个类声明

时间:2018-03-15 05:02:18

标签: python python-2.7

当我在python中声明类 slots work

where

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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