生产代码中绝不使用反射!Python呢?

10 投票
5 回答
3751 浏览
提问于 2025-04-16 10:18

我写过C#,听到的一个观点是“在生产代码中绝对不要使用反射”。我在测试代码中用过反射,但从来没有在实际运行的代码中用过。大家的理由都很合理,总有其他方法可以通过增加抽象层或设计模式来实现。

现在我开始写一些比较复杂的Python代码,我在想这个原则是否也适用。看起来Python在设计时就考虑到了反射。模块和类会把成员存储在一个很容易访问的字典里。例如,Django的模型中的Meta类就使用字符串来引用成员。

我可以在Python中写出像C#/Java那样的代码,但我真的不想这样做。我仍然坚信在这些语言中“不要使用反射”。那么,Python的方式是不是根本就不同呢?

5 个回答

3

是的,从这个角度来看,Python 的开发确实有很大的不同。

在 C# 或 Java 中,反射是指运行时能够了解正在运行的代码的一些信息,并根据这些信息做出决策。

因为 Python 使用的是动态类型,所以任何类型的发现都是在运行时进行的,而不是在编译时。这基本上意味着,任何 Python 程序都必须使用反射才能正常工作,只不过在 Python 中不叫反射,而是叫做运行程序 :)
此外,Python 的哲学也很支持这种动态执行的特性,所以你应该大胆利用这一点。

附注:虽然在紧密循环中应该尽量避免使用反射,并且要知道反射的速度通常慢一到两个数量级,但在合适的情况下使用它并不需要害怕。

6

我觉得“生产代码中不要使用反射”这个说法在C#中并不完全正确。
反射常常能让程序员做一些其他方法无法做到的事情。
我会说“在生产代码中不要对非公共成员使用反射”,并且“使用反射要小心!”如果用得不对,可能会影响性能。但如果用得当,反而可能提高性能(想想静态反射就知道了)。
不要在频繁调用的代码中使用反射。
而Python则是一个动态语言,所有的概念都不一样。正常情况下(以及正确的做法)就是使用你提到的那些技术。

18

作为一种动态语言,Python和静态类型语言有很大的不同,所以在Python中,很多东西都是通过反射来实现的 :-) 而且我觉得“在生产代码中绝对不要使用反射”(针对静态语言)这个说法有点过于极端了。

撰写回答