一、模块
- Python程序的架构
Python程序的架构指将一个程序分割为源代码文件的集合以及将这些部分连接在一起的方法
Python源代码文件:*.py
一个py文件是一个模块(module)
多个模块可以组成一个包(package) - 模块的执行环境
模块包含变量、函数、类以及其他的模块(如果导入的话),而函数也有自己的本地变量 - 模块的作用
模块是Python中的最高级别组织单元,它将程序代码和数据封装起来以便重用 - 模块的三个角色
1.代码重用
2.系统命名空间的划分(模块可理解为变量名的封装,即模块就是命名空间)
3.实现共享服务和数据 - 数据分析领域常用的包
- 模块的导入
导入从本质上讲,就是在一个文件中载入另一个文件,并且能够读取那个文件的内容。一个模块内的内容通过这样的方法其属性(object,attribute)能够被外界使用。
模块导入方法:
1.import x
2.from x import *
3.from x import a,b,c
eg:
#导入整个模块
import numpy
from numpy import *
#只导入某个对象
from numpy import sqrt
- import搜索的路径顺序
1.程序的主目录
2.PYTHONPATH(环境变量)目录
3.标准链接库目录
4.任何.pth文件的内容
以上四个组件组合起来就变成了sys.path,其保存了模块搜索路径在机器上的实际配置,可以通过打印内置的sys.path列表来查看这些路径
搜索路径1和3是系统自定义的,而2和4可以用于拓展路径,从而加入自己的源代码目录
通过.pth文件修改搜索路径
#通过site模块的getsitepackages()函数获得包文件位置
import site
print site.getsitepackages()
#新建myworkpath.pth文件,列出模块搜索路径
#自定义路径
/data/myworkpath,pth
#将myworkpath.pth文件放在包文件目录下
#查看路径是否添加成功
import sys
print sys.path
临时修改模块搜索路径
#使用sys.path在Python程序运行时临时修改模块搜索路径
import sys
print sys.path
sys.path.append('/data')
print sys.path
二、Python中的类
- 面向对象编程语言
Python语言是一种面向对象编程语言(Object-Oriented Programming Language),简称为OOP语言
无论是变量还是函数,它们都是属于某一个特定的类(class)。类中的对象叫做该类的实例(instance)
特定类的所有对象都与方法(method)相关联,这些方法类似于一个函数,我们编写一次之后,可以重复的调用
一旦某个对象属于某个特定类之后,该对象就可以使用该类的所有方法 - init
__init__是一种特殊的方法,使得实例一开始就拥有类模板所具有的属性
self参数是类中函数定义时必须使用的参数,并且永远是第一个参数,该参数表示创建的实例本身
一旦__init__存在除了self之外的参数,那么在创建实例时,我们就需要传入相应的参数值(self不需要传入数值,Python解释器会自动将实例变量传入) - 成员的私有化
面向对象的语言一般都对对象有一些统一的要求。例如封装性。
封装性的意思是指,一个对象的成员属性要得到一定程度的保护。例如,要对一个对象的成员属性进行修改或访问,就必须通过对象允许的方法来进行(例如要求输入密码以确认拥有此权限等)。这样可以保护对象,使程序不易出错。
C+ +与Java语言中,严格地实现了对象的封装性。 - Python对于封装性的看法
设计封装的逻辑往往要耗费一定的精力,并且会导致代码更加冗长、不易读等等
Python的语言风格没有特别强调封装性。它主张程序员自己通过更加严谨的方式组织程序以避免出错,而不是通过在语言层面实现封装达到这一点。但是,在Python中仍然可以实现对象的(非严格意义上的)封装
如果我们希望某些内部属性不被外部访问,我们可以在属性名称前加上两个下划线表示将该属性成员私有化,该成员在内部可以被访问,但是在外部是不能够访问的。
成员私有化并不是代表完全不能够从外部访问成员,而是提高了访问的门槛,防止意外或者随意改变成员,引发错误。我们仍然可以通过_类名+私有变量,对变量进行访问
成员私有化不仅包括属性的私有化,也包括了方法的私有化,在方法名称前加上两个下划线"_"也可以使得函数只能被内部访问,不能够被外部访问
eg:
class student():
# 对象初始化方法,在创建对象的时候调用
def __init__(self, name, age, gender):
# 属性名称前加上两个下划线"_",表示将该属性成员私有化
self.__name = name
self.age = age
self.gender = gender
def print_info(self):
print(self.__name, self.age, self.gender)
s = student("dd", 22, "男")
# _类名+私有变量,访问私有变量
print(s._student__name)
输出结果:
dd
- 类的继承
与封装性一样,继承性是面向对象程序设计的另一种重要的属性。
类的继承好比孩子与父母之间的继承关系一样,孩子拥有父母所拥有的许多特性。在编程语言中,如果一个新的类继承另外一个类,那么这个新的类成为子类(Subclass),被子类继承的类称为父类
我们可以把更加一般、范围大的类的属性在父类定义,把更加具体、范围小的在子类定义。