簡體   English   中英

Python __slots__不適用於某些類聲明

[英]Python __slots__ doesn't work with a certain class declaration

當我在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

似乎有兩件事觸發了您的錯誤:

首先, 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

__slots__屬性僅在“新樣式”類中起作用(它們並不是真正的“新”類,它們在Python 2.2中已經出現15年多了)。 在Python 2中,如果您繼承自object (或其他某種新樣式類),則只會獲得一個新樣式類。 通過將一個或多個基類放在class聲明中派生類名稱之后的括號中來聲明繼承。 因此,您的CSStudent的第二個實現不是新型類,因為它不繼承任何東西。 因此__slots__不起作用(它只是一個奇怪的命名屬性)。

新樣式類和舊樣式類之間的區別僅在Python 2上存在。Python3刪除了舊樣式類,因此您的兩個類實現在Python 3解釋器中的工作方式相同(不再需要顯式繼承自object )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM