7

我对 Python 很陌生,我似乎无法理解这一点。考虑一下这个简单的 Python 代码。

class point:
   i = 34


test = point()
test.y = 45

print test.y 

如您所见,我的点实例称为测试,但是test.y = 45y它不是点类的数据成员时执行了。没有引发错误,并且 y 属性似乎已自动添加到类中。

为什么会这样?这不是误会吗?或者我错过了一些非常基本的东西。C++ 不能做同样的事情,它会引发编译器错误。这个奇怪的功能有什么原因吗?

4

3 回答 3

7

因为这是 Python,而不是 C++(或 Java)。将其称为错误功能是对 Python 工作原理的根本误解。

在 Python 中,您不需要声明变量或属性。没有“点类的数据成员”这样的东西。你i只是一个类级别的变量,但无论你将该属性与类关联起来,它都是一样的。您可以动态地将属性添加到类、实例、模块,无论您喜欢什么。这就是动态类型语言的意义所在。

事实上,这样做是定义实例变量的唯一方法。正如我所说,您的iabove 是一个类属性,由该类的所有成员共享。获得实例级变量的唯一方法是“动态地”添加它,通常在__init__方法中,但您可以在任何您喜欢的地方添加。

于 2012-07-21T21:37:30.323 回答
4

这只是脚本语言的常见问题。Python 可以让你做到这一点,Ruby 也可以,事实上,你不必预先定义你的局部变量。为什么不在你的课上?不仅如此,您还可以选择新插入的变量/函数是只影响一个对象还是该类的所有实例。

在 TDD 和 UnitTesting 中做大量工作的人喜欢这种错误功能。实际上,我什至会说 C++ 静态类型不会减少我的程序错误,其减少我的程序错误的程度几乎不亚于一种可以简化我的单元测试的语言。

但是,如果您担心,您可以随时使用 _____slots_____

https://stackoverflow.com/a/3603624/253098

于 2012-07-21T22:19:35.120 回答
2

这就是 Python 的工作原理。您可以随意在类或实例上创建新属性。它的缺点是在编译时无法捕获许多错误,但它的优点是允许更灵活的动态编程。

如果您对这种行为感到惊讶,您应该阅读Python 教程以熟悉 Python 基础知识。

于 2012-07-21T21:36:04.647 回答