我一直在为塔架开发一个非常简单的 crud 生成器。我想出了一些检查的东西
SomeClass._sa_class_manager.mapper.c
可以检查这个(或调用以下划线开头的方法)吗?我总是认为这是合法的,尽管不赞成,因为它严重依赖于类/对象的内部结构。但是,嘿,既然 python 并没有真正意义上的 Java 接口,也许没关系。
我一直在为塔架开发一个非常简单的 crud 生成器。我想出了一些检查的东西
SomeClass._sa_class_manager.mapper.c
可以检查这个(或调用以下划线开头的方法)吗?我总是认为这是合法的,尽管不赞成,因为它严重依赖于类/对象的内部结构。但是,嘿,既然 python 并没有真正意义上的 Java 接口,也许没关系。
故意(在 Python 中)没有“私有”范围。这是一个约定,任何以下划线开头的东西都不应该被理想地使用,因此如果它的行为或定义在下一个版本中发生变化,你可能不会抱怨。
一般来说,这通常表明该方法实际上是内部的,而不是文档化接口的一部分,不应依赖。该库的未来版本可以自由重命名或删除此类方法,因此如果您关心未来的兼容性而不必重写,请避免这样做。
如果有效,为什么不呢?但是,当 _sa_class_manager 进行重组、将自己绑定到此特定版本的 SQLAlchemy 或创建更多工作以跟踪更改时,您可能会遇到问题。由于 SQLAlchemy 是一个快速移动的目标,因此您可能已经在一年内到达那里。
最好的方法是将您想要的 API 集成到 SQLAlchemy 本身中。
由于已经提到的原因,这通常不是一个好主意。但是,Python 故意允许这种行为,以防没有其他方法可以做某事。
例如,如果您有一个封闭源代码编译的 Python 库,而作者认为您不需要直接访问某个对象的内部状态(但您确实需要),您仍然可以获得所需的信息。在跟上不同的版本时,您遇到了之前提到的相同问题(如果您足够幸运,它仍然得到维护),但至少您实际上可以做您想做的事情。