Sum*_*goe 10 python filenames class
我来自Java背景.我正在阅读官方Python教程,但似乎无法找到与Python源文件名和类相关的信息.
在Java中,文件名与主类名和.java扩展名相同.在Python中是什么情况?在官方教程的示例中,他们正在编写多个类,并且没有提到文件名.我有点迷茫.
我有一个名为test_pie.py的文件名.内容是 -
class ListTest:
list1 = [2, 'a', 'ab', 'c', 'aa', 0]
list2 = ['b', list1[-2:-5]]
def PrintList(self):
print list1
print list2
Run Code Online (Sandbox Code Playgroud)
对于list1和list2:我得到 -
未定义变量:list1 list发现于:test_pie
未定义变量:list2 list发现于:test_pie
小智 10
有一个档案.期.它包含的内容对导入没有兴趣,文件名或位置对包含的代码没有任何影响(通常 - 它在执行期间可以访问,所以一些元编程使用它但是应该是不可知的实际价值).
文件的内容并不局限于单一的阶级,很少有人强加这样的限制到自己.Python并不仅仅是一种OO语言,只要它是合理的,你就可以并且应该拥有免费的函数,并且模块在代码组织中的类之上被看到 - 如果几个类紧密相关,它们应该可以放在一个模块中.
您的示例代码/问题与此无关,这是在给定文件中确定范围的问题.类确实有自己的作用域,但你不能也不应该在这样的方法(直接)中使用包含类的类变量 - 它会使代码无视子类中的新值集.相反,你要么使用类方法(顺便说一下,你应该阅读http://dirtsimple.org/2004/12/python-is-not-java.html)或者利用实例继承所有成员的事实.这个类只是用它作为前缀self..
Java 不是 Python。Python 不是 Java。您刚刚在这里发现了许多差异;超出您的预期。
在 Java 中,文件名与主类名加上 .java 扩展名相同。在 Python 中又是怎样的情况呢?
相反:文件名不一定与任何内容相同。
在官方教程的示例中,他们正在编写多个类,并且没有提及文件名。我有点迷失了。
因为这并不重要。(请注意,在 Java 中,每个文件仍然可以有多个类,只要只有一个具有相应名称的类是public。在 Python 中,public实际上并不存在这样的类。)
对于 list1 和 list2:我得到-
未定义的变量:list1 列表 发现于:test_pie
未定义的变量:list2 列表 发现于:test_pie
这是因为这些属性(在 Java 中称为“字段”)属于类,而不是对象。
在 Python 中,方法(与 Java 同名)仍然“属于”类,但它是通过对象访问的。self这就是为什么Python 方法需要一个显式参数:因为my_object.do_something(x, y, z)被隐式转换为MyClass.do_something(my_object, x, y, z)( 或多或少;“绑定”在幕后有一些技巧,它允许您将其视为my_object.do_something对象。是的,在 Python 中,一切都是对象对象,甚至函数。而你认为 Java 是面向对象的。哈。)
如果您告诉 Python 在哪里查找类属性,您仍然可以通过对象访问类属性。在PrintList、list1和list2范围内- 因为Python实际上只有两个范围:本地和全局。但self是 在范围内(它是一个参数,因此它在本地范围内),并且您可以访问self.list1,因为如果没有对象属性,则在 Python 中查找对象的属性会回退到类属性。(实际上,它比这更复杂;您可以将几个不同的特殊方法名称挂钩插入到进程中,更不用说如何处理继承了。)
因此,您现在可能想知道如何将属性获取到实际的 Python 对象而不是其类中。答案是:你只需分配它们即可。如果您不设置任何限制,那么您可以随时以任何名称分配它们。该对象基本上只是一本字典。如果您熟悉 Java* script *(一种与 Java 完全无关的语言),那么它的工作方式几乎相同。然而,为了控制疯狂,通常在一个专门命名的方法中分配起始属性值__init__,该方法在创建对象时立即自动调用(如果找到)(但它不是通常意义上的构造函数;即角色由 扮演__new__,但在 Python 中你几乎从来不需要它),然后只重新分配给在那里设置的属性,而不是创建新的属性。
如果您有一个新式类(在 3.x 中是自动的;在 2.x 中您必须至少间接地从内置类型继承object),则可以通过为名为的特殊命名的类属性指定值来设置限制__slots__。这应该是有效标识符名称的字符串列表。完成此操作后,Python 将 (a) 使用该信息来优化其对象数据的内部存储;(b) 禁止您向对象添加其他名称的属性;(c) 禁止为对象实例创建特殊__dict__属性,该属性是将属性名称映射到属性值的字典。(你以为 Java 支持反射。哈。)它不会自动为命名属性分配任何值;它会自动为命名属性分配任何值。在分配它们之前尝试访问它们将会raise AttributeError。