Python教程:深入理解slots特性

需积分: 5 0 下载量 111 浏览量 更新于2024-08-04 收藏 17KB DOCX 举报
"PYTHON学习教程资源:使用slots操作代码.docx" 在Python编程中,`__slots__` 是一个特殊属性,用于节省内存和提高性能。它允许程序员在类定义时预定义实例对象能够拥有的属性,从而限制了实例在运行时动态添加属性的能力。这个特性在创建大量实例或需要优化内存使用的场景中尤其有用。 正常情况下,Python的类实例可以在运行时自由地添加任意属性,就像在示例中创建`Student`类并动态绑定`name`和`set_age`方法那样。然而,这种灵活性可能会导致额外的内存消耗,因为每个实例都会有一个独立的`__dict__`字典来存储其属性。`__slots__`的引入就是为了克服这个问题。 当我们为类定义`__slots__`时,我们提供一个包含属性名称的元组。这样,Python将为这些属性创建专用的槽(而不是`__dict__`),从而减少内存占用。例如: ```python class Student(object): __slots__ = ('name', 'age') # 定义允许的属性:name和age def set_age(self, age): self.age = age s = Student() s.name = 'Michael' # 可以正常设置name属性 s.set_age(25) # 可以调用set_age方法 # 尝试添加不在__slots__内的属性会抛出错误 try: s.score = 100 except AttributeError as e: print(e) # 属性'score'已无效,因为未在__slots__中声明 ``` 在这个例子中,由于我们定义了`__slots__`,所以尝试给`s`添加不在`__slots__`列表中的`score`属性会引发`AttributeError`。这意味着`__slots__`有效地限制了实例能够持有的属性。 需要注意的是,一旦类定义了`__slots__`,它的子类也会继承这个限制,除非子类也定义了自己的`__slots__`。此外,`__slots__`不包括类的特殊方法(如`__init__`、`__getattr__`等)以及任何通过`@property`装饰器定义的属性。 总结起来,`__slots__`在Python中是一个非常有用的工具,它可以提高性能,节省内存,并且可以帮助进行更严格的属性管理。在设计面向对象的系统时,尤其是在处理大量实例或需要优化资源使用的情况下,考虑使用`__slots__`是一个明智的选择。不过,也要注意它会限制类的灵活性,因此在不需要严格控制实例属性时,应谨慎使用。

2023-06-10 06:10:14,356 INFO mapreduce.Job: Job job_1686300831839_0056 failed with state FAILED due to: Task failed task_1686300831839_0056_m_000001 Job failed as tasks failed. failedMaps:1 failedReduces:0 killedMaps:0 killedReduces: 0 2023-06-10 06:10:14,536 INFO mapreduce.Job: Counters: 9 Job Counters Failed map tasks=1 Killed map tasks=3 Launched map tasks=4 Data-local map tasks=4 Total time spent by all maps in occupied slots (ms)=20374 Total time spent by all reduces in occupied slots (ms)=0 Total time spent by all map tasks (ms)=20374 Total vcore-milliseconds taken by all map tasks=20374 Total megabyte-milliseconds taken by all map tasks=20862976 2023-06-10 06:10:14,561 WARN mapreduce.Counters: Group FileSystemCounters is deprecated. Use org.apache.hadoop.mapreduce.FileSystemCounter instead 2023-06-10 06:10:14,566 INFO mapreduce.ExportJobBase: Transferred 0 bytes in 19.7479 seconds (0 bytes/sec) 2023-06-10 06:10:14,582 WARN mapreduce.Counters: Group org.apache.hadoop.mapred.Task$Counter is deprecated. Use org.apache.hadoop.mapreduce.TaskCounter instead 2023-06-10 06:10:14,582 INFO mapreduce.ExportJobBase: Exported 0 records. 2023-06-10 06:10:14,582 ERROR mapreduce.ExportJobBase: Export job failed! 2023-06-10 06:10:14,585 ERROR tool.ExportTool: Error during export: Export job failed! at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:445) at org.apache.sqoop.manager.SqlManager.exportTable(SqlManager.java:931) at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:80) at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:99) at org.apache.sqoop.Sqoop.run(Sqoop.java:147) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76) at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243) at org.apache.sqoop.Sqoop.main(Sqoop.java:252)

2023-06-11 上传