类和对象
Python 是一门面向对象的语言,所以他和Java一样都具备类、继承等概念。
类
类定义仍然使用 class 关键字。
py
class MyClass:
i = 12345
def f(self):
return 'hello world'
# 实例化类
x = MyClass()
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())
注意 :这里实例化类的时候不像其他语言一样使用new关键字,而是直接使用=。
类默认具备一个 __init__() 的构造方法,在类实例化的时候会自动调用。同时 __init__() 作为一个方法,也可以存在参数。
py
class Complex:
def __init__(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i) # 输出结果:3.0 -4.5
类方法
类中的方法存在一个与外部方法不同的点,类方法第一个参数是 self ,他指向的是 类实例。
注意 :这里的 self 只是一个约定俗成的叫法,而非关键字。你可以叫他 this ,也可以叫 test 等等。
继承
Python 也支持继承,派生类使用下面的方式。
区别于传统的 extends 派生。
py
class NewClass(BaseClass): ...
如果是多继承,则采用 逗号分隔 的方式。
方法重写
在子类中使用与父类相同的方法名实现 方法重写。
在实例化的子类对象中,可以使用 super 方法调用父类的方法。
py
class Parent:
# 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent):
# 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child()
# 子类实例
c.myMethod()
# 子类调用重写方法
super(Child,c).myMethod()
#用子类对象调用父类已被覆盖的方法
私有属性
类中的私有属性使用开头双下划线定义,私有属性不能被类外部的使用或访问。
同样,私有方法也是使用双下划线定义。
py
class MyClass:
__private_attrs = 1
# 私有属性
def __private_getAttrs(self):
print('打印', self.__private_attrs)
__init__: 构造函数,在生成对象时调用__del__: 析构函数,释放对象时使用__repr__: 打印,转换__setitem__: 按照索引赋值__getitem__: 按照索引获取值__len__: 获得长度__cmp__: 比较运算__call__: 函数调用__add__: 加运算__sub__: 减运算__mul__: 乘运算__truediv__: 除运算__mod__: 求余运算__pow__: 乘方
命令空间和作用域
命名空间
Python中的命名空间遵循 局部 ------ 全局 ------ 内置 的原则。
也就是说代码在运行寻找变量的时候,先在当前命名空间中找,没有的话再去全局找,最后去找内置的。
作用域
Python中的作用域遵循 LEGB 原则。
也就是说先在当前局部作用域中找,然后去外部找,再去全局找,找不到再去内置找。
注意:一般情况下建议当前变量在哪个范围内运行,就在哪里定义。最小作用域原则。
File
Python使用 open 方法打开一个文件。
py
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
一般只写前面两个参数。
file 对象比较常用的方法一般有以下几个
open打开文件close关闭文件write写入文件tell获取当前文件位置
OS
os模块主要是用于与操作系统进行交互。
注意:OS模块是跨平台的,在不同的平板一般不需要写兼容性相关的代码。
py
import os
# 获取当前目录
current_directory = os.getcwd()
print("当前工作目录:", current_directory)
# 切换工作目录,参数为目标目录
os.chdir("/path/to/new/directory")
print("新的工作目录:", os.getcwd())
# 获取目录中的内容列表
files_and_dirs = os.listdir()
print("目录内容:", files_and_dirs)
# 创建目录,如果当前目录已经存在则报错FileExistsError,而非覆盖。
os.mkdir("new_directory")
# 删除空目录,如果当前目录不为空,则报错FileNotFoundError。
os.remove("file_to_delete.txt")
# 重命名文件/目录,第一个参数为旧文件名,第二个参数为新文件名
os.rename("old_name.txt", "new_name.txt")
# 获取环境变量,如果不存在则返回 None
home_directory = os.getenv("HOME")
print("HOME 目录:", home_directory)
# 执行 shell 指令
os.system("ls -l")
除了上述方法外,OS模块还有非常多的方法,但是需要注意的是部分方法在 Python2 中可能可用,但 Python3 中已经删除。
异常
语法报错
大多数情况下比较常见的就是语法报错:SyntaxError: invalid syntax
运行报错
py
10 * (1/0)
# 0 不能作为除数,触发异常 Traceback (most recent call last): File "<stdin>", line 1, in ? ZeroDivisionError: division by zero
4 + spam*3
# spam 未定义,触发异常 Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'spam' is not defined
'2' + 2
# int 不能与 str 相加,触发异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str
异常捕获
异常捕获使用 try...except 语句。
注意 :这里不是 try...catch!
py
while True:
try: x = int(input("请输入一个数字: "))
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
这里 except 在捕获异常的时候可以同时存在多种捕获,用于执行不同的异常操作。
py
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
except 还存在一个 else 子句,用于在没有任何异常的时候执行。【使用的并不算多】
py
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
finally 用于执行无论是否发生异常都将执行的语句。
py
try:
runoob()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('这句话,无论异常是否发生都会执行。')
抛出异常
Python 使用 raise 抛出异常,类似于Js中的 throw。
语法格式为:raise [Exception [, args [, traceback]]]
py
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))