我正在制作一个编程框架(基于Django),适用于编程经验有限的学生.学生应该从我的基类继承(它们本身是从Django模型,表单和视图继承而来).
我现在正在和一些学生一起测试这个问题,问题是当他们在IDE中编写代码时(大多数都是使用PyCharm),自动完成给了他们很多建议,因为有很多继承的方法和属性,90其中%与他们无关.
有没有办法隐藏这些继承的成员?目前我主要考虑如何在自动完成中隐藏它们(在PyCharm和其他IDE中).它们可以(并且可能应该)在被调用时仍然可以工作,但是不会出现在自动完成的地方.
我尝试过设置__dict__,但这并没有影响自动填充中显示的内容.我的另一个想法是使用组合而不是继承,但我必须更详细地考虑这一点.
编辑:此框架未在CS类中使用; 相反,学生将使用它来构建非CS域的应用程序.因此,我的首要任务是尽可能保持简单,即使它不是一种"纯粹"的方法.(尽管如此,我正在考虑这些论点,因为它们确实有价值.)
免责声明:以下方法不是很干净(但这就是你要求的).
现在,好消息是这个方法永远不会破坏你的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..你应该试一试,亲眼看看.
| 归档时间: |
|
| 查看次数: |
1053 次 |
| 最近记录: |