[英]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.