子类允许任意属性

2024-05-19 22:47:18 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码:

class testobj( object ): ...

x = testobj()
x.toast = 'toast'
print( x.toast )   # <-- toast

y = object()
y.toast = 'toast'

最后一行产生错误

AttributeError                            Traceback (most recent call last)
<ipython-input-24-873470c47cb3> in <module>()
----> 1 y.toast = 'toast'

AttributeError: 'object' object has no attribute 'toast'

我也试过了

class testobj2( object ):
    def __init__( self ):
        super().__init__()

其行为方式相同,允许设置任意属性。你知道吗

基于我对Python继承的理解,我希望testobj具有与object相同的行为(所有方法,包括__setattr__),因为它是一个子类,没有定义新方法。但是,这不一样,因为上面的代码允许我设置任意属性。为什么会发生这种情况?如何禁止设置任意属性?你知道吗


Tags: 方法代码most属性objectinit错误call
1条回答
网友
1楼 · 发布于 2024-05-19 22:47:18

防止创建属性的一个简单方法是定义__slots__

class A:
  __slots__ = ('a', 'b')

a = A()
a.a = 1
a.b = 2
a.c = 3 # Raises

你知道吗

object()不允许任意属性,但这是object实例的特殊规则,在继承时丢失。你知道吗

相关问题 更多 >