我想隐藏一些公共方法继承期间class B从class 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中做到这一点?
这是我的评论的答案形式:您可以从第三个类 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)
作为旁注,如果您想要的是可能的,它会破坏多态性。这个不会。
塞尔丘克的建议是最好的,但有时重构太麻烦了。
所以相反,这里有一些东西会让你的同事像女妖一样尖叫并诅咒你的名字。
它通过使用元类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)