簡體   English   中英

我如何在子類中驗證 __slots__?

[英]How can I validate __slots__ in child classes?

python 文檔 3.3.2.4.1中,它說“在父類中聲明的__slots__在子類中可用。但是,子類將獲得__dict____weakref__除非它們還定義了__slots__ (它應該只包含任何附加插槽的名稱)。 “

但是,當我如下測試時:

class A(object):
    __slots__ = ('a')

class B(A):
    __slots__ = ('b')

b = B()
B.z = 'z'
B.a = 'a'
print(B.z) #z
print(B.a) #a
print(B.__dict__) #{'__module__': '__main__', '__slots__': ('b',), 'b': <member 'b' of 'B' objects>, '__doc__': None, 'z': 'z', 'a': 'a'}

BzB.__dict__都沒有拋出異常,代碼管理到 output。

我很困惑為什么Class B中的__slots__ = ('b')無法驗證。 理論上,它應該在 Bz 處拋出異常,因為槽中的鍵不包含它。

你能幫忙解釋一下這個奇怪的點嗎? 如果可能的話,您能否幫助提供子類中插槽的正確使用方法?

對了,我的python版本是3.9.7

太感謝了。

__slots__應該是一個元組,但你實際上沒有元組,你有一個字符串。 嘗試做__slots__ = ("a",)

此外,插槽適用於實例,而不適用於類。 您正在將屬性分配給 class object。請嘗試以下操作。 這些實例按預期工作。

a = A()
a.a = "a"
# a.b = "b"  # fails

b = B()
b.b = "b"
b.a = 'a'
# b.z = 'z'  # fails

暫無
暫無

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

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