从函数定义外部向 Python 类添加数据成员
Posted
技术标签:
【中文标题】从函数定义外部向 Python 类添加数据成员【英文标题】:Adding data members to Python classes from outside the function definition 【发布时间】:2012-07-20 17:08:04 【问题描述】:我对 Python 很陌生,我似乎无法理解这一点。考虑一下这个简单的 Python 代码。
class point:
i = 34
test = point()
test.y = 45
print test.y
如您所见,我有一个名为 test 的点实例,但是当 y
不是
点类的数据成员。没有抛出错误,并且 y 属性似乎有
已自动添加到班级。
为什么会这样?这不是误会吗?或者我错过了一些非常基本的东西。 C++ 不能做同样的事情,它会引发编译器错误。这个奇怪的功能有什么原因吗?
【问题讨论】:
我没有投反对票,但您的问题表明您对 Python 知之甚少。你应该通过 Python tutorial。 我没有投反对票,但是:您刚才说过任何不能用 C++ 完成的事情都是错误功能。学习更多的语言。 @Hamish 我从来没有说过“任何不能用 C++ 完成的事情都是错误的”我来自 C++/C 背景,因此我提到了 C++。我关于这是一个错误的问题,并不是为了修辞,而是真实的。在这一点上,Python 资深人士肯定可以指导我并纠正我的误解。 我认为这不值得一票否决,为了记录,我理解你对 c++ 的引用纯粹是好奇 你也可以定义一个类来禁止它。 【参考方案1】:因为这是 Python,而不是 C++(或 Java)。将其称为错误功能是对 Python 工作原理的根本误解。
在 Python 中,您不需要声明变量或属性。没有“点类的数据成员”这样的东西。您的 i
只是一个类级别的变量,但无论您将该属性与该类相关联的任何地方,它都是相同的。您可以动态地将属性添加到类、实例、模块,无论您喜欢什么。这就是动态类型语言的意义所在。
事实上,这样做是唯一定义实例变量的方式。正如我所说,您上面的i
是一个类属性,由该类的所有成员共享。获取实例级变量的唯一方法是“动态”添加它,通常在 __init__
方法中,但您可以在任何您喜欢的地方添加。
【讨论】:
如果你愿意,你可以特别阻止作业作为课程定义的一部分。【参考方案2】:这只是脚本语言中的常见事物。 Python 可以让你做到这一点,Ruby 也可以,事实上,你不必预先定义你的局部变量。为什么不在你的课上?不仅如此,您还可以选择新插入的变量/函数是只影响一个对象还是该类的所有实例。
在 TDD 和单元测试中做繁重工作的人喜欢错误功能。实际上,我什至会说 C++ 静态类型不会减少我的程序错误,几乎没有像一种可以简化单元测试的语言那样减少。
但是,如果您担心,您可以随时使用 _____slots_____
https://***.com/a/3603624/253098
【讨论】:
【参考方案3】:这就是 Python 的工作原理。您可以随意在类或实例上创建新属性。它的缺点是在编译时无法捕捉到许多错误,但它的优点是允许更灵活的动态编程。
如果您对这种行为感到惊讶,您应该阅读the Python tutorial 以熟悉 Python 基础知识。
【讨论】:
以上是关于从函数定义外部向 Python 类添加数据成员的主要内容,如果未能解决你的问题,请参考以下文章