简介
本文介绍python语言基本知识,Python提供了灵活的输入输出、数据类型、继承机制以及对象属性管理,通过__special__
方法和__slots__
等特性优化性能和内存使用。
具体包括元类, bool
是int
子类,用于兼容性。 MRO(方法解析顺序),对象与属性,__getattr__
, __setattr__
, __delattr__
管理对象属性,哈希与ID,dir
& vars
,__slots__
, 控制实例变量存储,节省内存,防止动态属性添加。
本文的关键点,包括input
和print
的用法、基本数据类型、MRO、对象属性、哈希和内存标识以及__slots__
的作用。
1 input 和 print
完整的print
print(*values, sep=' ', end='\n',file=sys.stdout, flush=False)
简单的value表示可用提供任意数量的位置参数给 print,它将正确打印。 默认使用空格分隔
使用print将输出打印到文件
with open('test.txt', 'w') as f:
print("hello!", file=f)
有些语言有特殊对象,可用让你调用print方法,通过使用熟悉的print接口写入文件。
在python,您可更进一步,临时配置print函数默认写入文件
sys.stdout = open('mytext.txt', 'w')
flush是print函数的布尔标志。它所做的只是告诉print将文本立即写入控制台/文件,而不是将其放入缓冲区中。
这通常没有太大的区别,但是如果您将一个非常大的字符串打印到控制台,您可能希望将其设置True 为避免向用户显示输出时出现滞后
2 五个基本数据类型关键字 str, bytes, int, bool, float, complex
基于文本的数据类型
- 字符串类型 str
字节码 bytes
实际上是计算中所有I/O的基础,如果您了解计算机,所有数据其实
都以位和字节存储和处理,这是终端的真正工作方式
sys模块的I/O缓冲区
sys.stdout.buffer sys.stdin.buffer
缓冲区对象接收butes,将它们直接写入输出缓冲区,并返回字节数
>>> char_count = sys.stdout.buffer.write("hello!\n".encode()) hello! >>> char_count 7
为了证明都是字节,另一个字节打印表情符号的示例
b'\xf0\x9f\x90\x8d' # 🐍的utf-8编码 encoded string of the snake emoji _ = sys.stdout.buffer.write(b'\xf0\x9f\x90\x8d') 🐍
int是另一种广泛使用的基本原始数据类型。
它也是 2 种其他数据类型的最小公分母:float和complex. complex是 的超类型float,而后者又是 的超类型int。
3 mro对这些类的属性来自行检查
mro 代表 方法解析顺序,它定义了查找类调用方法的顺序。
本质上,方法调用首先在类本身调用如果它不存在,则在父类搜索,然后在其父类的父类搜索一直到顶部。
object.python的所有内容都继承自object,是的,python的几乎所有东西都是对象
>>> int.mro()
[<class 'int'>, <class 'object'>]
>>> float.mro()
[<class 'float'>, <class 'object'>]
>>> complex.mro()
[<class 'complex'>, <class 'object'>]
>>> str.mro()
[<class 'str'>, <class 'object'>]
>>> bool.mro()
[<class 'bool'>, <class 'int'>, <class 'object'>]
您可从它们 “根”类型 看出,所有其他数据类型都不是任何东西的 子类 除了 object 它将永远存在,除了bool 它继承自int。
现在 您可能希望知道 为什么要bool subclass int,这主要是因为兼容性原因。
所以您都可用在预期bool 的任何地方传递 一个 int。
4 对象 object
obj.x通过调用getattr的方法访问属性。
类似地 setattr 设置一个新属性和 delattr删除一个属性分别调用和。
对象的哈希是通过预定义的hash方法生成的,对象的字符串表示来自repr。
而python的所有对象都是object.
5 小结
创建对象使用type 基础元类时,通过指定不同的内置函数的原语,可以实现很多特殊的功能,适应不同的场景,比如在某些会话调用中,惰性计算的例子。这在将来章节我们可以谈到。