什么是对象
对象是内存中专门用来存储数据的一块区域。对象中可以存放各种数据(比如:数字、布尔值、代码)对象由三部分组成:
- 对象的标识(id)
- 对象的类型(type)
- 对象的值(value)
Python是一门面向对象的编程语言 , 所谓的面向对象的语言,简单理解就是语言中的所有操作都是通过对象来进行的 , 面向对象的编程语言,关注的是对象,而不关注过程 , 对于面向对象的语言来说,一切都是对象 . 面向对象的编程思想,将所有的功能统一保存到对应的对象中 , 这种方式编写的代码,比较容易阅读,并且比较易于维护,容易复用。但是这种方式编写,不太符合常规的思维,编写起来稍微麻烦一点 .
类(class)
我们目前所学习的对象都是Python内置的对象 , 但是内置对象并不能满足所有的需求,所以我们在开发中经常需要自定义一些对象 , 类,简单理解它就相当于一个图纸。在程序中我们需要根据类来创建对象 , 类就是对象的图纸!我们也称对象是类的实例(instance), 如果多个对象是通过一个类创建的,我们称这些对象是一类对象 , 像int()
float()
bool()
str()
list()
dict()
. . . 这些都是类 . a = int(10)
#创建一个int类的实例 , 该操作 等价于 a = 10
. 我们自定义的类都需要使用大写字母开头,使用大驼峰命名法(帕斯卡命名法)来对类命名 .
定义一个简单的类 , 使用class关键字来定义类,语法和函数很像!
class 类名([父类名]):
代码块
1 2 3 4 5 6 7
| class MyClass(): pass
print(MyClass ,id(MyClass), type(MyClass))
|
使用类来创建对象,就像调用一个函数一样 . 使用MyClass创建一个对象 :
1 2 3 4 5 6 7 8 9 10 11
| mc = MyClass() mc_2 = MyClass() mc_3 = MyClass() mc_4 = MyClass() print(mc,type(mc))
r1 = isinstance(mc,MyClass) r2 = isinstance(mc_2,str) print(r1,r2)
|
现在我们通过MyClass这个类创建的对象都是一个空对象 , 也就是对象中实际上什么都没有,就相当于是一个空的盒子, 可以向对象中添加变量,对象中的变量称为属性 . 语法:对象.属性名 = 属性值
1 2 3 4
| mc.name = '孙悟空' mc_2.name = '猪八戒'
print(mc_2.name)
|
接下来尝试定义一个有意义的类 , 定义一个表示人的类 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Person(): name = 'swk' def say_hello(self): print(f"你好! 我是{self.name}")
p1 = Person() p2 = Person() print(p2.name)
p1.name = '猪八戒' p2.name = '沙和尚' p1.say_hello() p2.say_hello()
del p2.name print(p1.name) print(p2.name) p2.say_hello()
|
对象在寻找属性时 , 会优先在对象中寻找该属性, 如果找不到, 会去定义它的类对象中继续寻找 , 所以最后一行的say_hello()
方法会返回swk
的值.
对象的初始化
在类中可以定义一些特殊方法(魔术方法), 特殊方法都是以__
开头,__
结尾的方法 , 特殊方法不需要我们自己调用,不要尝试去调用特殊方法 , 特殊方法将会在特殊的时刻自动调用 . 学习特殊方法要学习特殊方法什么时候调用 , 特殊方法有什么作用 .
首先介绍__init__
特殊方法, 该方法在创建对象时自动执行 , 比如p1=Person()
的执行过程:
- 创建一个变量
- 在内存中创建一个新对象
__init__(self)
方法执行
- 将对象的id赋值给变量
init会在对象创建以后离开执行 , init可以用来向新创建的对象中初始化属性 , 调用类创建对象时,类后边的所有参数都会依次传递到init()中 . 目前来讲,对于Person类来说name是必须的,并且每一个对象中的name属性基本上都是不同 , 而我们现在是将name属性在定义为对象以后,手动添加到对象中,这种方式很容易出现错误 , 我们希望,在创建对象时,必须设置name属性,如果不设置对象将无法创建 , 并且属性的创建应该是自动完成的,而不是在创建对象以后手动完成 . 于是 , 可以使用__init__
特殊方法来实现上述功能.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Person : def __init__(self,name): self.name = name def say_hello(self): print('大家好,我是%s'%self.name) p1 = Person('孙悟空') p2 = Person('猪八戒') p3 = Person('沙和尚') p4 = Person('唐僧')
print(p1.name) print(p2.name) print(p3.name) print(p4.name)
p4.say_hello()
|
于是, 类的基本机构可以写为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class 类名([父类]) :
公共的属性...
def __init__(self,...): ...
def method_1(self,...): ...
def method_2(self,...): ...
...
|
封装
封装是面向对象的三大特性之一 , 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 , 如何隐藏一个对象中的属性?将对象的属性名,修改为一个外部不知道的名字 . 如何获取(修改)对象中的属性?需要提供一个getter和setter方法使外部可以访问到属性 , getter 获取对象中的指定属性(get_属性名)setter 用来设置对象的指定属性(set_属性名).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Dog: ''' 表示狗的类 ''' def __init__(self , name , age): self.hidden_name = name self.hidden_age = age
def say_hello(self): print('大家好,我是 %s'%self.hidden_name)
def get_name(self): ''' get_name()用来获取对象的name属性 ''' return self.hidden_name
def set_name(self , name): self.hidden_name = name
def get_age(self): return self.hidden_age
def set_age(self , age): if age > 0 : self.hidden_age = age d = Dog('旺财',8)
print(d.hidden_name)
d.set_name('小黑')
print(d.get_age())
|
Python中对于想要隐藏的属性可以使用__
开头 , 双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Person: def __init__(self,name): self.__name = name
def get_name(self): return self.__name
def set_name(self , name): self.__name = name p = Person("孙悟空") print(p.get_name())
p._Person__name = '猪八戒' print(p.get_name()) print(p._Person__name)
|
因此 , 使用__
开头的属性,实际上依然可以在外部访问,所以这种方式我们一般不用 . 在实际开发中 , 一般我们会将一些私有属性(不希望被外部访问的属性)以_
开头 , 一般情况下,使用_
开头的属性都是私有属性,没有特殊需要不要修改私有属性 .
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Person: def __init__(self,name): self._name = name
def get_name(self): return self._name
def set_name(self , name): self._name = name
p = Person('孙悟空')
print(p._name)
|
在对属性进行封装后 , 每次设置属性值 和获取属性值的过程都变成了通过方法进行 , 比直接通过对象.属性
的方式调用和修改要麻烦一些. 为了简便 , python中为setter方法可getter 方提供了装饰器 , 定义方法时使用装饰器 , 即可实现像是直接调用属性一样去调用方法.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Person: def __init__(self,name,age): self._name = name self._age = age
@property def name(self): print('get方法执行了~~~') return self._name
@name.setter def name(self , name): print('setter方法调用了') self._name = name
@property def age(self): return self._age
@age.setter def age(self , age): self._age = age
p = Person('猪八戒',18)
p.name = '孙悟空' p.age = 28
print(p.name,p.age)
|
继承
有一个类,能够实现我们需要的大部分功能,但是不能实现全部功能 , 如何能让这个类来实现全部的功能呢?
- 直接修改这个类,在这个类中添加我们需要的功能
- 但是 , 修改起来会比较麻烦,并且会违反OCP原则
- 直接创建一个新的类
- 但是 , 创建一个新的类比较麻烦,并且需要大量的进行复制粘贴,会出现大量的重复性代码
- 直接从该类中来继承它的属性和方法
继承是面向对象三大特性之一 , 通过继承我们可以使一个类获取到其他类中的属性和方法 , 在定义类时,可以在类名后的括号中指定当前类的父类(超类、基类、super), 子类(衍生类)可以直接继承父类中的所有的属性和方法 . 通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合OCP原则 . 所以我们经常需要通过继承来对一个类进行扩展 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Animal: def run(self): print('动物会跑~~~')
def sleep(self): print('动物睡觉~~~')
class Dog(Animal): def bark(self): print('汪汪汪~~~') d = Dog() print(isinstance(d,Dog)) print(isinstance(d,Animal))
d.run() d.sleep() d.bark()
|
在创建类时,如果省略了父类,则默认父类为object , object是所有类的父类,所有类都继承自object .
1 2 3 4 5 6
| class Person(object): pass print(issubclass(Animal , Dog)) print(issubclass(Animal , object)) print(issubclass(Person , object))
|
如果在子类中如果有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们成为叫做方法的重写(覆盖,override).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
class Animal: def run(self): print('动物会跑~~~')
def sleep(self): print('动物睡觉~~~')
class Dog(Animal): def bark(self): print('汪汪汪~~~')
def run(self): print('狗跑~~~~') d = Dog() d.run()
|
当我们调用一个对象的方法时,会优先去当前对象中寻找是否具有该方法,如果有则直接调用 , 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法,如果没有,则去父类的父类中寻找,以此类推,直到找到object,如果依然没有找到,则报错 .
父类中的所有方法都会被子类继承,包括特殊方法,也可以重写特殊方法 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| class Animal: def __init__(self,name): self._name = name
def run(self): print('动物会跑~~~')
def sleep(self): print('动物睡觉~~~')
@property def name(self): return self._name
@name.setter def name(self,name): self._name = name
class Dog(Animal):
def __init__(self,name,age): super().__init__(name) self._age = age
def bark(self): print('汪汪汪~~~')
def run(self): print('狗跑~~~~')
@property def age(self): return self._age
@age.setter def age(self,age): self._age = name
d = Dog('旺财',18)
print(d.name) print(d.age)
|
在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类 , 可以在类名的()
后边添加多个类,来实现多重继承 , 多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法 , 在开发中没有特殊的情况,应该尽量避免使用多重继承,因为多重继承会让我们的代码过于复杂 .
如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,然后找第三个 . . .
前边父类的方法会覆盖后边父类的方法 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class A(object): def test(self): print('AAA')
class B(object): def test(self): print('B中的test()方法~~')
def test2(self): print('BBB') class C(A,B): def test2(self): print('CCC')
print(B.__bases__) print(C.__bases__)
c = C() c.test()
class D(C,B): pass print(D.__bases__) d = D() d.test2()
|
多态
多态是面向对象的三大特征之一 , 多态从字面上理解是多种形态 , 狗(狼狗、藏獒、哈士奇 . . . ), 一个对象可以以不同的形态去呈现 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| class A: def __init__(self,name): self._name = name
@property def name(self): return self._name @name.setter def name(self,name): self._name = name
class B: def __init__(self,name): self._name = name
@property def name(self): return self._name @name.setter def name(self,name): self._name = name
class C: pass
a = A('孙悟空') b = B('猪八戒') c = C()
def say_hello(obj): print('你好 %s'%obj.name)
def say_hello_2(obj): if isinstance(obj , A): print('你好 %s'%obj.name)
say_hello(b) say_hello_2(b)
|
len()
之所以一个对象能通过len()
来获取长度,是因为对象中具有一个特殊方法__len__
.
换句话说,只要对象中具有__len__
特殊方法,就可以通过len()
来获取它的长度.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| l = [1,2,3] s = 'hello'
print(len(l)) print(len(s))
class B: def __init__(self,name): self._name = name
def __len__(self): return 10
@property def name(self): return self._name @name.setter def name(self,name): self._name = name
class C: pass
b = B('猪八戒') c = C() print(len(b))
|
面向对象的三大特征:
- 封装 : 确保对象中的数据安全
- 继承 : 保证了对象的可扩展性
- 多态 : 保证了程序的灵活性
类中的属性和方法
直接在类中定义的属性是类属性 , 类属性可以通过类或类的实例访问到 , 但是类属性只能通过类对象来修改,无法通过实例对象修改 .
通过实例对象添加的属性属于实例属性 , 实例属性只能通过实例对象来访问和修改,类对象无法访问修改 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class A(object): count = 0 def __init__(self): self.name = '孙悟空'
a = A() print(a.count) A.count= 100 a.count = 10 print(a.count) print(A.count) A.name = '猪八戒' print(a.name) print(A.name)
|
在类内部使用 @classmethod
来修饰的方法属于类方法 , 类方法的第一个参数是cls,也会被自动传递,cls就是当前的类对象 .
在类中定义,以self为第一个参数的方法都是实例方法 , 实例方法在调用时,Python会将调用对象作为self传入 , 实例方法可以通过实例和类去调用 , 当通过实例调用时,会自动将当前调用对象作为self传入 ; 当通过类调用时,不会自动传递self,此时我们必须手动传递self .
类方法和实例方法的区别,实例方法的第一个参数是self,而类方法的第一个参数是cls . 类方法可以通过类去调用,也可以通过实例调用,没有区别 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class A(object): count = 0 def test(self): print('这是test方法~~~ ' , self) @classmethod def test_2(cls): print('这是test_2方法,他是一个类方法~~~ ',cls) print(cls.count)
a = A()
A.test(a)
a.test()
A.test_2()
a.test_2()
|
在类中使用 @staticmethod
来修饰的方法属于静态方法 , 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例去调用 , 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数 , 静态方法一般都是一些工具方法,和当前类无关 .
1 2 3 4 5 6 7 8
| class A(object): @staticmethod def test_3(): print('test_3执行了~~~')
a = A() A.test_3() a.test_3()
|
垃圾回收
就像我们生活中会产生垃圾一样,程序在运行过程当中也会产生垃圾 , 程序运行过程中产生的垃圾会影响到程序的运行的运行性能,所以这些垃圾必须被及时清理 . 在程序中没有被引用的对象就是垃圾,这种垃圾对象过多以后会影响到程序的运行的性能 , 所以我们必须进行及时的垃圾回收,所谓的垃圾回收就是讲垃圾对象从内存中删除 . 在Python中有自动的垃圾回收机制,它会自动将这些没有被引用的对象删除,所以我们不用手动处理垃圾回收 .
实际上 , 在对象垃圾被回收前 回调用__del__
特殊方法.
1 2 3 4 5 6 7 8 9 10 11
| class A: def __init__(self): self.name = 'A类'
def __del__(self): print('A()对象被删除了~~~',self)
a = A() a = 5 input("回车键退出 . . .")
|
上述代码的执行结果:
1 2
| A()对象被删除了~~~ <__main__.A object at 0x0000025D1F253910> 回车键退出 . . .
|
特殊方法
特殊方法,也称为魔术方法 , 特殊方法都是使用__
开头和结尾的 , 特殊方法一般不需要我们手动调用,需要在一些特殊情况下自动执行 , 前面异界介绍过一些特殊方法 , 这里集中介绍几种特殊方法 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Person(object): """人类""" def __init__(self, name , age): self.name = name self.age = age
def __str__(self): return 'Person [name=%s , age=%d]'%(self.name,self.age)
def __repr__(self): return 'Hello' def __bool__(self): return self.age > 17 def __gt__(self , other): return self.age > other.age
p1 = Person('孙悟空',18) p2 = Person('猪八戒',28)
print(p1) print(p2)
print(p1 > p2) print(p2 > p1)
if p1 : print(p1.name,'已经成年了') else : print(p1.name,'还未成年了')
|
其他特殊方法(顾名思义即可):
- object.__add__(self, other)
- object.__sub__(self, other)
- object.__mul__(self, other)
- object.__matmul__(self, other)
- object.__truediv__(self, other)
- object.__floordiv__(self, other)
- object.__mod__(self, other)
- object.__divmod__(self, other)
- object.__pow__(self, other[, modulo])
- object.__lshift__(self, other)
- object.__rshift__(self, other)
- object.__and__(self, other)
- object.__xor__(self, other)
- object.__or__(self, other)
- object.__lt__(self, other) 小于 <
- object.__le__(self, other) 小于等于 <=
- object.__eq__(self, other) 等于 ==
- object.__ne__(self, other) 不等于 !=
- object.__gt__(self, other) 大于 >
- object.__ge__(self, other) 大于等于 >=
模块(module)
模块化,模块化指将一个完整的程序分解为一个一个小的模块 , 通过将模块组合,来搭建出一个完整的程序 . 不采用模块化,统一将所有的代码编写到一个文件中 . 采用模块化,将程序分别编写到多个文件中 , 模块化的优点:
在Python中一个py文件就是一个模块,要想创建模块,实际上就是创建一个python文件 , 注意:模块名要符号标识符的规范 .
使用import
关键字, 在一个模块中引入外部模块 .
- import 模块名 (模块名,就是python文件的名字,注意不要py)
- import 模块名 as 模块别名
可以引入同一个模块多次,但是模块的实例只会创建一个 . import可以在程序的任意位置调用,但是一般情况下,import语句都会统一写在程序的开头 , 在每一个模块内部都有一个__name__属性,通过这个属性可以获取到模块的名字 . __name__属性值为 __main__的模块是主模块,一个程序中只会有一个主模块 , 主模块就是我们直接通过 python 执行的模块 .
1
| print('我是test_module模块')
|
1 2 3
| import test_module as test print(test.__name__) print(__name__)
|
执行结果为:
1 2 3 4
| 我是test_module模块 test_module __main__
|
访问模块中的变量:模块名.变量名
访问模块中的函数 : 模块名.函数名()
1 2 3 4 5 6 7 8
| a = 10 b = 20 def test2(): print('这是test模块中的test2') class Test: def __init__(self): print('使用模块中的类创建对象')
|
1 2 3 4 5
| import test as m print(m.a,m.b) m.test2() t = m.Test()
|
也可以只引入模块中的部分内容 , 语法: from 模块名 import 变量,变量....
1 2 3 4
| from m import Person from m import test from m import Person,test from m import *
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| # 添加了_的变量,只能在模块内部访问,在通过import * 引入时,不会引入_开头的变量 _c = 30
# 可以在模块中定义函数,同样可以通过模块访问到 def test(): print('test')
def test2(): print('test2')
# 也可以定义类 class Person: def __init__(self): self.name = '孙悟空'
# 编写测试代码,这部分代码,只要当当前文件作为主模块的时候才需要执行 # 而当模块被其他模块引入时,不需要执行的,此时我们就必须要检查当前模块是否是主模块 if __name__ == '__main__': test() test2() p = Person() print(p.name)
|
包(Package)
包也是一个模块 , 当我们模块中代码过多时,或者一个模块需要被分解为多个模块时,这时就需要使用到包 . 普通的模块就是一个py文件,而包是一个文件夹 , 包中必须要一个 __init__.py 这个文件,这个文件中可以包含有包中的主要内容 .
从包hello中引入a.py 和 b.py .
1 2
| def test(): print('test')
|
1 2 3 4
| from hello import a , b
print(a.c) print(b.d)
|
在引入一次包后 , 包中会出现一个__pycache__
文件夹 , 该文件夹是模块缓存文件 , py代码在执行前,需要被解析器先转换为机器码,然后再执行 , 所以我们在使用模块(包)时,也需要将模块的代码先转换为机器码然后再交由计算机执行 , 而为了提高程序运行的性能,python会在编译过一次以后,将代码保存到一个缓存文件中 , 这样在下次加载这个模块(包)时,就可以不再重新编译而是直接加载缓存中编译好的代码即可 .
该文件夹中的内容入下:
打开a.cpython-36.pyc
查看其中的内容: 是一些16进制表示的二进制代码
Python标准库
为了实现开箱即用的思想,Python中为我们提供了一个模块的标准库 , 在这个标准库中,有很多很强大的模块我们可以直接使用,并且标准库会随Python的安装一同安装 .
sys
模块,它里面提供了一些变量和函数,使我们可以获取到Python解析器的信息 .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import sys
import pprint
print(sys.argv) print()
pprint.pprint(sys.modules) print()
pprint.pprint(sys.path) print()
print(sys.platform)
sys.exit('程序出现异常,结束!') print('hello')
|
执行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| ['test.py']
{'__main__': <module '__main__' from 'test.py'>, '_abc': <module '_abc' (built-in)>, '_codecs': <module '_codecs' (built-in)>, '_collections': <module '_collections' (built-in)>, '_collections_abc': <module '_collections_abc' from 'D:\\Python38\\lib\\_collections_abc.py'>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_functools': <module '_functools' (built-in)>, '_heapq': <module '_heapq' (built-in)>, '_imp': <module '_imp' (built-in)>, '_io': <module 'io' (built-in)>, '_locale': <module '_locale' (built-in)>, '_operator': <module '_operator' (built-in)>, '_signal': <module '_signal' (built-in)>, '_sitebuiltins': <module '_sitebuiltins' from 'D:\\Python38\\lib\\_sitebuiltins.py'>, '_sre': <module '_sre' (built-in)>, '_stat': <module '_stat' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_weakref': <module '_weakref' (built-in)>, 'abc': <module 'abc' from 'D:\\Python38\\lib\\abc.py'>, 'builtins': <module 'builtins' (built-in)>, 'codecs': <module 'codecs' from 'D:\\Python38\\lib\\codecs.py'>, 'collections': <module 'collections' from 'D:\\Python38\\lib\\collections\\__init__.py'>, 'copyreg': <module 'copyreg' from 'D:\\Python38\\lib\\copyreg.py'>, 'encodings': <module 'encodings' from 'D:\\Python38\\lib\\encodings\\__init__.py'>, 'encodings.aliases': <module 'encodings.aliases' from 'D:\\Python38\\lib\\encodings\\aliases.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from 'D:\\Python38\\lib\\encodings\\latin_1.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'D:\\Python38\\lib\\encodings\\utf_8.py'>, 'enum': <module 'enum' from 'D:\\Python38\\lib\\enum.py'>, 'functools': <module 'functools' from 'D:\\Python38\\lib\\functools.py'>, 'genericpath': <module 'genericpath' from 'D:\\Python38\\lib\\genericpath.py'>, 'heapq': <module 'heapq' from 'D:\\Python38\\lib\\heapq.py'>, 'io': <module 'io' from 'D:\\Python38\\lib\\io.py'>, 'itertools': <module 'itertools' (built-in)>, 'keyword': <module 'keyword' from 'D:\\Python38\\lib\\keyword.py'>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'ntpath': <module 'ntpath' from 'D:\\Python38\\lib\\ntpath.py'>, 'operator': <module 'operator' from 'D:\\Python38\\lib\\operator.py'>, 'os': <module 'os' from 'D:\\Python38\\lib\\os.py'>, 'os.path': <module 'ntpath' from 'D:\\Python38\\lib\\ntpath.py'>, 'pprint': <module 'pprint' from 'D:\\Python38\\lib\\pprint.py'>, 're': <module 're' from 'D:\\Python38\\lib\\re.py'>, 'reprlib': <module 'reprlib' from 'D:\\Python38\\lib\\reprlib.py'>, 'site': <module 'site' from 'D:\\Python38\\lib\\site.py'>, 'sre_compile': <module 'sre_compile' from 'D:\\Python38\\lib\\sre_compile.py'>, 'sre_constants': <module 'sre_constants' from 'D:\\Python38\\lib\\sre_constants.py'>, 'sre_parse': <module 'sre_parse' from 'D:\\Python38\\lib\\sre_parse.py'>, 'stat': <module 'stat' from 'D:\\Python38\\lib\\stat.py'>, 'sys': <module 'sys' (built-in)>, 'time': <module 'time' (built-in)>, 'types': <module 'types' from 'D:\\Python38\\lib\\types.py'>, 'winreg': <module 'winreg' (built-in)>, 'zipimport': <module 'zipimport' (frozen)>}
['G:\\&近期文档\\01-代码-笔记\\lesson_06_对象', 'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs', 'D:\\Python38\\lib', 'D:\\Python38', 'D:\\Python38\\lib\\site-packages']
win32 程序出现异常,结束!
|
os
模块让我们可以对操作系统进行访问 .
1 2 3 4 5 6 7 8 9 10 11 12 13
| import os
import pprint
pprint.pprint(os.environ['path'])
os.system('dir') os.system('notepad')
|
执行结果: 返回系统的环境变量 , 返回当前文件的目录 , 并且打开了记事本 .