如何隐藏/删除Python继承类中的一些方法?

Cha*_*eon 10 python

想隐藏一些公共方法继承期间class Bclass A

class A(object):
  def someMethodToHide():
    pass

  def someMethodToShow():
    pass

class B(A):
  pass

len(set(dir(A)) - set(dir(B))) == 1
Run Code Online (Sandbox Code Playgroud)

如果可能,如何在python中做到这一点?

Sel*_*cuk 9

这是我的评论的答案形式:您可以从第三个类 C 继承 A 和 B。就像这样:

class C(object):
  def someMethodToShow():
    pass

class A(C):
  def someMethodToHide():
    pass

class B(C):
  pass
Run Code Online (Sandbox Code Playgroud)

作为旁注,如果您想要的是可能的,它会破坏多态性。这个不会。


dil*_*ert 5

塞尔丘克的建议是最好的,但有时重构太麻烦了。

所以相反,这里有一些东西会让你的同事像女妖一样尖叫并诅咒你的名字。

它通过使用元类hide_meta, 来添加重载__getattribute____dir__方法。只需设置__metaclass__ = hide_meta和即可将其应用于所需的类__excluded__ = ["list", "of", "unwanted", "attributes/methods"]

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()
Run Code Online (Sandbox Code Playgroud)