在Python中,我可以隐藏基类的成员吗?

Rex*_*exE 4 python pycharm

我正在制作一个编程框架(基于Django),适用于编程经验有限的学生.学生应该从我的基类继承(它们本身是从Django模型,表单和视图继承而来).

我现在正在和一些学生一起测试这个问题,问题是当他们在IDE中编写代码时(大多数都是使用PyCharm),自动完成给了他们很多建议,因为有很多继承的方法和属性,90其中%与他们无关.

有没有办法隐藏这些继承的成员?目前我主要考虑如何在自动完成中隐藏它们(在PyCharm和其他IDE中).它们可以(并且可能应该)在被调用时仍然可以工作,但是不会出现在自动完成的地方.

我尝试过设置__dict__,但这并没有影响自动填充中显示的内容.我的另一个想法是使用组合而不是继承,但我必须更详细地考虑这一点.

编辑:此框架未在CS类中使用; 相反,学生将使用它来构建非CS域的应用程序.因此,我的首要任务是尽可能保持简单,即使它不是一种"纯粹"的方法.(尽管如此,我正在考虑这些论点,因为它们确实有价值.)

Tho*_*zco 8

免责声明:以下方法不是很干净(但这就是你要求的).

现在,好消息是这个方法永远不会破坏你的Python.实际上,它只会影响IDE.

但请注意,PyCharm将来可能会变得更聪明,并且无论如何都可以自动完成工作.不过,我认为这不会成为Jetbrains团队的首要任务!


开始了.

你所要做的就是混淆PyCharm.PyCharm将无法可靠地跟踪使用的导入__import__,因此我们将使用它来导入您的django模块(如果PyCharm没有导入您正在导入的模块,则无法知道您正在使用哪个类以及哪些方法出现在自动完成窗口中!).

在以下示例中,我们假设:

  • _base.py 是包含要扩展的类的django文件(以及要隐藏的方法)
  • base.py 是包含您要为学生提供的课程的文件(您要显示的方法)
  • test.py 是您的学生将要写的文件

_base.py

这里没什么特别的

class DjangoBaseClass(object):
    def method_that_is_hidden(self):
        print "The hidden method is there!"
Run Code Online (Sandbox Code Playgroud)

base.py

请注意导入

base = __import__("_base")  # This is equivalent to `import base`. Python understands it, but PyCharm doesn't.

class YourBaseClass(base.DjangoBaseClass):  # PyCharm doesn't know what class this is! No autocomplete.
    def method_that_shows(self):
        print "The method that shows is there!"
Run Code Online (Sandbox Code Playgroud)

重要说明:在多级导入的情况下,语法略有不同.例如,要继承django.views.generic.base.View,请执行:

base = __import('django.views.generic.base', fromlist=['View',])

class MyView(base.View):
    # Your stuff
Run Code Online (Sandbox Code Playgroud)

请注意,如果PyCharm将来变得更聪明,你将不得不添加更多的间接(例如,而不是__import__('base'),你可以使用__import__(''.join(['b', 'a', 's', 'e'])).但这会变得混乱.

test.py

这里没什么特别的

from base import YourBaseClass

class StudentClass(YourBaseClass):
    pass

if __name__ == "__main__":
    c = StudentClass()
    c.method_that_is_hidden()
    c.method_that_shows()
Run Code Online (Sandbox Code Playgroud)

运行test.py脚本时,方法都有效:

$ python test.py
The hidden method is there!
The method that shows is there!
Run Code Online (Sandbox Code Playgroud)

但是当你使用PyCharm时,method_that_is_hidden它不会显示在自动完成中:

隐藏的方法没有显示


注意:我相信PyCharm现在具有在运行测试时跟随调用树的功能,因此如果您的学生使用PyCharm运行测试,PyCharm可能会接受这些方法的存在.我想他们不会在课堂定义中表现出来,但是如果你的学生写作,他们可能会表现出来c..你应该试一试,亲眼看看.

  • @aruisdante我怀疑作者不希望他的学生首先使用Django的公共API.虽然我同意这是一个黑客,但我们必须意识到,可能无法一次性教导学生一切,因此首先依靠几个黑客来隐藏复杂性是合理的. (2认同)