我是Python的新手,我似乎无法理解这一点.考虑这个简单的Python代码.
class point:
i = 34
test = point()
test.y = 45
print test.y
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,我称之为测试点,但是test.y = 45当y不是点类的数据成员时就这样做了.没有抛出任何错误,y属性似乎已自动添加到类中.
为什么会这样?这不是一个错误吗?或者我错过了一些非常基本的东西.使用C++无法做同样的事情,它会引发编译器错误.有什么理由这个奇怪的功能?
因为这是Python,而不是C++(或Java).将其称为错误是对Python如何工作的基本误解.
在Python中,您不会声明变量或属性.没有"点类的数据成员"之类的东西.您i只是一个类级变量,但无论您将该属性与类关联在哪里,它都是相同的.您可以动态地向类,实例,模块添加属性,无论您喜欢什么.这就是动态类型语言.
实际上,这样做是定义实例变量的唯一方法.正如我所说,你的i上面是一个类属性,由类的所有成员共享.获取实例级变量的唯一方法是"动态"添加它,通常在__init__方法中,但您可以在任何您喜欢的地方执行.
这只是脚本语言中常见的事情。Python 可以做到这一点,Ruby 也可以,而且实际上,您无需预先定义局部变量。为什么不在你的课堂上呢?不仅如此,您还可以选择新插入的变量/函数是仅影响一个对象还是该类的所有实例。
在 TDD 和单元测试中做繁重工作的人喜欢这个错误特性。实际上,我什至可以说,C++ 静态类型减少程序错误的程度几乎不如一种可以简化单元测试的语言,而这恰恰可以做到这一点。
但是,如果您担心,您可以随时使用 _____slots_____