<p>您可以创建一个<a href="https://docs.python.org/3/howto/descriptor.html" rel="nofollow noreferrer">descriptor</a>类来模拟“已删除”属性。然后您可以将“要删除”的名称指定给该类的一个实例。在</p>
<p>下面是一个完整的示例,显示了访问子类上的属性时出现的错误/回溯及其实例。通过引发自定义错误,回溯显式地指示此属性已被故意“删除”。在</p>
<pre><code>In [1]: class DeletedAttributeError(AttributeError):
...: pass
...:
...:
...: class DeletedAttribute:
...: def __set_name__(self, owner, name):
...: self.name = name
...:
...: def __get__(self, instance, owner):
...: cls_name = owner.__name__
...: accessed_via = f'type object {cls_name!r}' if instance is None else f'{cls_name!r} object'
...: raise DeletedAttributeError(f'attribute {self.name!r} of {accessed_via} has been deleted')
...:
...:
...: class Foo:
...: def hide_me(self):
...: pass
...:
...:
...: class Bar(Foo):
...: hide_me = DeletedAttribute()
...:
In [2]: Foo.hide_me
Out[2]: <function __main__.Foo.hide_me(self)>
In [3]: Bar.hide_me
-
DeletedAttributeError Traceback (most recent call last)
<ipython-input-3-240c91cc1fc8> in <module>
> 1 Bar.hide_me
<ipython-input-1-0f699423deb7> in __get__(self, instance, owner)
10 cls_name = owner.__name__
11 accessed_via = f'type object {cls_name!r}' if instance is None else f'{cls_name!r} object'
-> 12 raise DeletedAttributeError(f'attribute {self.name!r} of {accessed_via!r} has been deleted')
13
14
DeletedAttributeError: attribute 'hide_me' of type object 'Bar' has been deleted
In [4]: Bar().hide_me
-
DeletedAttributeError Traceback (most recent call last)
<ipython-input-4-9653f0da628c> in <module>
> 1 Bar().hide_me
<ipython-input-1-0f699423deb7> in __get__(self, instance, owner)
10 cls_name = owner.__name__
11 accessed_via = f'type object {cls_name!r}' if instance is None else f'{cls_name!r} object'
-> 12 raise DeletedAttributeError(f'attribute {self.name!r} of {accessed_via!r} has been deleted')
13
14
DeletedAttributeError: attribute 'hide_me' of 'Bar' object has been deleted
</code></pre>
<p>上面的代码可以在python3.6+上运行。在</p>