模块
模块中写全局变量
# 文件名:mtest.py#在 Python 下 py 后缀名的文件就是模块g_number1 = 100g_number2 = 100
使用 import 可以直接导入模块,导入模块的同时会执行其中的代码,但是同一个模块的代码不论直接 import 多少次,都只执行一次,
# 文件名:test.py# 类似于 C++ 中的 include 没有使用命名空间import mprint(m.g_number1)# 类似 C++ 中 inlcude + using std::xxx 指令# 最推荐使用的方式,但是使用较为繁琐from m import g_number1print(g_number1)# 类似于 include + using namesapce xxx 直接# 使用指定模块内的所有对象不需要加模块名from m import *print(g_number1)

拓展:
import ..          #导入整个模块
from .. import ..      #导入模块中的类、函数或者变量
from .. import       #导入模块中的所有*公开成员
from .. import .. as ..      #这个是给导入的成员取个别名
测试模块是被导入的还是不被导入的
# 文件名:mtest.pydef main():# 如果当前模块不是被导入的,那么这就是主模块print("这里是主函数,需要在当前为主模块的时候被执行")def nomain():#如果当前模块是被导入的,那么这就不是主模块print("该模块是被导入的")# 模仿主函数的行为,如果当前模块为主模块,那么 __name__# 这个全局变量中就会保存 __main__ 字符串if __name__ == "__main__":main()else:nomain()
# 文件名:test.pyimport mtest
name
# 文件名:mtest.py# 写在全局范围内的代码无论如何都会被执行# 如果是被导入的模块,那么 __name__ 就是# 模块名,去除后缀的文件名称print(__name__)
#文件名:test.pyimport mtest
访问模块私有的属性
#文件名:mtest.py# 模块的私有属性(不会被直接访问到的)# 以单下划线开头的全局变量不能被其它# 模块以 from xxx import * 的方式访问_pnumber = 10
可以通过import mtest方式导入访问(注意用模块名点出来)
#文件名:test.pyimport mtestprint(mtest._pnumber)
可以通过from mtest import _pnumber方式导入访问
#文件名:test.pyfrom mtest import _pnumberprint(_pnumber)
类
构造与析构
class 类名(基类名称):
 在 Python3 中所有的类都默认继承自 object
class Student(object):# 所有的构造函数都叫做 __init__def __init__(self):pass# 所有的析构函数都叫做 __del__def __del__(self):pass# 如果不编写这两个函数,会默认生成
类属性
1.类和对象的区别:主要是类属性和实例属性的区别
class Student(object):# 在类的作用域中直接编写的属性就是类属性# 类属性类似于 C++ 中的静态数据成员class_number = 0# 一个方法,只要调用这个方法就会生成一个# 新的类属性def add_number3(self):Student.class_number3 = 200obj = Student()print(Student.__dict__) #__dict__是一个字典,保存了当前的实例或者对象# 中的所有属性,包括函数和内置属性和自定义属性print(obj.__dict__)

2.访问类属性
可以使用类名和实例访问到类属性,推荐使用类名
class Student(object):# 在类的作用域中直接编写的属性就是类属性# 类属性类似于 C++ 中的静态数据成员class_number = 0# 一个方法,只要调用这个方法就会生成一个# 新的类属性def add_number3(self):Student.class_number3 = 200obj = Student()print(obj.class_number, Student.class_number)print(Student.__dict__)print(obj.__dict__)

3.修改类属性
使用类名可以直接修改类属性,如果尝试使用实例修改类属性,本质上是给实例添加了一个自己的属性
class Student(object):# 在类的作用域中直接编写的属性就是类属性# 类属性类似于 C++ 中的静态数据成员class_number = 0# 一个方法,只要调用这个方法就会生成一个# 新的类属性def add_number3(self):Student.class_number3 = 200obj = Student()Student.class_number=99obj.class_number=98print(obj.class_number, Student.class_number)print(Student.__dict__)print(obj.__dict__)

4.添加类属性
可以在成员方法或类外使用类名动态的添加属性
class Student(object):# 在类的作用域中直接编写的属性就是类属性# 类属性类似于 C++ 中的静态数据成员class_number = 0# 一个方法,只要调用这个方法就会生成一个# 新的类属性def add_number3(self):Student.class_number3 = 200obj = Student()Student.class_number2 = 100print(Student.__dict__)print(obj.__dict__)obj.add_number3()print(Student.__dict__)print(obj.__dict__)
实例属性
1.实例属性就是使用 self 或者 实例名 定义出来的属性,每一个实例都会拥有自己的实例属性,同样可以使用类名或者 self 动态添加属性
class Student(object):# 构造函数中添加的实例属性是每一个实例都有的def __init__(self):self.number = 10# 调用这个函数会动态添加属性def add_number2(self):self.number2 = 20# 创建两个实例分别测试object1 = Student()object2 = Student()print(object1.__dict__, "\n", object2.__dict__)# 动态的使用 self 添加属性object1.add_number2()print(object1.__dict__, "\n", object2.__dict__)# 动态的使用 实例名称 添加属性object2.number3 = 30print(object1.__dict__, "\n", object2.__dict__)

此时类属性并没有增加
2.删除一个属性
class Student(object):# 构造函数中添加的实例属性是每一个实例都有的def __init__(self):self.number = 10# 调用这个函数会动态添加属性def add_number2(self):self.number2 = 20# 创建两个实例分别测试object1 = Student()object2 = Student()# 动态的使用 self 添加属性object1.add_number2()# 动态的使用 实例名称 添加属性object2.number3 = 30#del object1.number2#print(object1.__dict__, "\n", object2.__dict__)print(object1.__dict__, "\n", object2.__dict__)del object2.number3print(object1.__dict__, "\n", object2.__dict__)

