模块搜索路径
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径放在sys模块的path变量中:

import sys
sys.path

如果我们要添加自己的搜索目录,有两种方法:
一是直接修改sys.path,添加要搜索的目录:

import sys
sys.path.append('users/michael/my_py_scripts')

这种方法是在运行时修改,运行结束后失效。
第二种方法是设置环境变量PYTHONPATH,该环境变量会被自动添加的模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。

在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

我们以一个例子来说明面向过程和面向对象在程序流程上的不同之处。

假设我们要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以用一个dict表示:

std1={'name':'MIchael','score':98}
std2={'name':'Bob','score':81}

def print_score(std):
    print('%s:%s' % (std['name'],std['score']))

print(print_score(std1))

处理学生成绩可以通过函数实现,比如打印学生成绩,见上代码。

如果采用面向对象的程序设计思想,我们首先思考的不是程序的执行流程,而是student这种数据类型应该被视为一个对象,这个对象拥有name和score这两个属性(Property)。如果要打印一个学生的成绩,首先必须创建出这个学生对应的对象,然后,给对象发一个print_score消息,让对象自己把自己的数据打印出来。

class Student(object):


    def __init__(self,name,score):
        self.name=name
        self.score=score


    def print_score(self):
        print('%s:%s' % (self.name,self.score))

#给对象发消息实际上就是调用对象对应的关联函数,我们称之为对象的方法(Mehod),
bart=Student('Bart Simpson',59)
lisa=Student('Lisa Simpson',87)
bart.print_score()
lisa.print_score()

输出结果:
Bart Simpson:59
Lisa Simpson:87

面向对象的设计思想是从自然界中来的,因为在自然界中,类(class)和实例(instance)的概念是很自然的。class是一种抽象概念,比如我们定义的class——student,是指学生这个概念,而实例(instance)则是一个个具体的student,比如,Bart Simpson和LIsa Simpson是两个具体的Student。

所以,面向对象的设计思想是抽象出class,根据class创建instance。
面向对象的抽象程度又比函数要高,因为一个class即包含数据,又包含操作数据的方法。

小结:

面向对象最重要的概念就是类(classs)和实例(instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

仍以Student类为例,在Python中,定义类是通过Class关键字:

class Student(object):
    pass

class 后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念后面讲,通常,如果没有合适的继承类,及使用object类,这是所有类最终都会继承的类。
定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现的:

python安装的模块在pycharm中能用吗_解决在PyCharm里无法识别Python里安装的模块 python安装的模块路径_面向对象

可以看到,变量bart指向的就是一个Student的实例,后面的0x10a67a590是内存地址,每个object的地址都不一样,而Student本身则是一个类。

可以自由地给一个实例变量绑定属性,比如,给实例bart绑定一个name属性:

python安装的模块在pycharm中能用吗_解决在PyCharm里无法识别Python里安装的模块 python安装的模块路径_面向对象_02


由于类可以起到模板地作用,因此,可以在创建实例地时候,把一些我们认为必须绑定地属性强制性填写进去。通过定义一个特殊地__init__方法,在创建实例地时候,就把name,score等属性绑上去:

python安装的模块在pycharm中能用吗_解决在PyCharm里无法识别Python里安装的模块 python安装的模块路径_面向对象_03


注意到__init__方法地第一个参数永远是self,表示创建地实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建地实例本身。有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

python安装的模块在pycharm中能用吗_解决在PyCharm里无法识别Python里安装的模块 python安装的模块路径_面向对象的程序设计_04


和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。