<p>Selcuk的<a href="https://stackoverflow.com/questions/23181442/how-to-hide-remove-some-methods-in-inherited-class-in-python/23182583#comment35454191_23181442">suggestion</a>是最好的,但是有时候重构太麻烦了。在</p>
<p>相反,这里有一些东西会让你的同事像女妖一样尖叫,诅咒你的名字。在</p>
<p>它通过使用元类<code>hide_meta</code>来添加重载的<code>__getattribute__</code>和{<cd3>}方法。只需设置<code>__metaclass__ = hide_meta</code>和{<cd5>},就可以将其应用到所需的类中。在</p>
<pre><code>class hide_meta(type):
def __new__(cls, cls_name, cls_bases, cls_dict):
cls_dict.setdefault("__excluded__", [])
out_cls = super(hide_meta, cls).__new__(cls, cls_name, cls_bases, cls_dict)
def __getattribute__(self, name):
if name in cls_dict["__excluded__"]:
raise AttributeError(name)
else:
return super(out_cls, self).__getattribute__(name)
out_cls.__getattribute__ = __getattribute__
def __dir__(self):
return sorted((set(dir(out_cls)) | set(self.__dict__.keys())) - set(cls_dict["__excluded__"]))
out_cls.__dir__ = __dir__
return out_cls
class A(object):
def someMethodToHide(self):
pass
def someMethodToShow(self):
pass
class B(A):
__metaclass__ = hide_meta
__excluded__ = ["someMethodToHide"]
a = A()
print dir(a)
b = B()
print dir(b)
b.someMethodToShow()
b.someMethodToHide()
</code></pre>