Python 模块(module)
import
import module1[, module2[,… moduleN]
- 在当前路径下搜索模块,如果没有,就在sys.path中的路径搜索。
- 导入模块后,需要以
模块名.函数
访问模块中的内容 - 一个模块只会被导入一次,不管执行了多少次import
import sys
print(sys.path)
['D:\\Code\\Python\\Ali_Python\\语法练习', 'D:\\Code\\Python\\Ali_Python', 'D:\\Code\\Python\\Ali_Python\\venv\\Scripts\\python37.zip', 'D:\\ProgramData\\Anaconda3\\DLLs', 'D:\\ProgramData\\Anaconda3\\lib', 'D:\\ProgramData\\Anaconda3', 'D:\\Code\\Python\\Ali_Python\\venv', 'D:\\Code\\Python\\Ali_Python\\venv\\lib\\site-packages', 'D:\\Code\\Python\\Ali_Python\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.7.egg', 'D:\\Code\\Python\\Ali_Python\\venv\\lib\\site-packages\\pip-10.0.1-py3.7.egg']
# Filename: support.py
def print_func( par ):
print ("Hello : ", par)
return
# 导入模块
import support
# 现在可以调用模块里包含的函数了
support.print_func("Runoob")
sys中的ps1和ps2定义了,主提示符和副提示符:
print(sys.ps1)
==> >>>
print(sys.ps2)
==> ...
from modulename import name
- 使用 import 直接把模块内(函数,变量的)名称导入到当前模块,此时modulename在当前模块不起作用。name可以直接使用
from modulename import *
导入所有名字,但是以单下划线_
不会被导入(不推荐)
__name__(双下划线)
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。参考
__name__
的值为 __main__
时,表示当前模块自身在运行
# name_test.py
if __name__ == "__main__":
print("程序自身在运行")
else:
print("被别的模块引入,__name__为:", __name__)
>> 自身执行:程序自身在运行
import name_test
>> 被别的模块引入,__name__为: name_test
dir()
dir(module)
列出模块内的所有名称。
dir()
列出当前模块的所有名称
包
- 类比:不同模块中的全局变量互不影响。不同包中的模块也互不影响
- 一个目录只有包含
__init__.py
文件(可以为空)才会被认为是包。
对于如下包结构:
导入特定模块(必须使用全名去访问):
import sound.effects.echo
sound.effects.echo.echofilter()
使用from导入模块(可以省去前缀):
from sound.effects import echo
echo.echofilter()
使用from直接导入模块中的函数或者变量:
from sound.effects.echo import echofilter
from package import item
: item可以是包、模块、函数和变量import item
: 先把item当成包,找不到在当成模块。否则就抛出异常import A.B.C
: C只能是模块或包,AB都必须是包
从包中导入*
导入语句遵循如下规则:如果包定义文件 init.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。
__all__ = [“echo”, “surround”, “reverse”]
导入包可以遵循目录结构:参考
-
from . import echo
: 在当前文件夹effects里导入echo子模块。 -
from .. import formats
: 在上一级文件夹sound里的__init__.py程序中导入formats。 -
from ..filters import equalizer
: 在上一级文件夹sound下的filters文件夹里的__init__.py程序中导入equalizer子模块。
面向对象
构造函数 __init__()
- 如果子类没有定义构造函数,则自动调用父类的构造函数
- 如果子类定义了构造函数,就不会调用父类的构造。但还可以显式的调用父类的构造。
super(子类,self).__init__(参数..)
父类名称.__init__(self,参数1,参数2,...)
类的方法与普通的函数只有一个区别: 第一个参数表示类的实例,按照惯例是self(类似于C++中的this指针),也可以用其他名字
# python对象
class classTest:
"This is a Python class"
def __init__(self):
print("这是构造函数")
def fun(self):
print(self)
print(self.__class__)
print(classTest.__doc__)
t = classTest()
t.fun()
###
这是构造函数
<__main__.classTest object at 0x000001AC843D3F60> # self 表示类的实例
<class '__main__.classTest'> # self.__class__ 表示类
This is a Python class # __doc__类的介绍
继承
Python支持多继承,如果不同的父类中有同名的函数时,按照括号中的顺序从左到右查找父类中的方法。
class DerivedClassName(Base1, Base2, Base3):
...
方法重写
子类可重写父类的方法,使用super函数可以访问父类中被隐藏的方法。
super(Class[, object])
Python3 和 Python2 的一个区别是: Python3 可以使用直接使用 super().xxx
代替 super(Class, self).xxx
Python3:
class B(A):
def add(self, x):
super().add(x)
Python2(Python3也可用):
class B(A):
def add(self, x):
super(B, self).add(x)
案例:
class A:
def add(self, a, b):
return a + b
class B(A):
def add(self, a, b):
# return super(B, self).add(a, b)
return super().add(a, b)
tim = B()
print(tim.add(1,2))
属性和方法
私有属性(或方法)使用两个下划线开头 __attribute
、__method()
关于类变量、成员变量、局部变量。本来很简单的东西在Python里搞得这么复杂。个人理解是:
- 成员变量一定是以
self.变量名
的形式出现 - 类变量可以用类名或对象来调用
- Pycharm似乎推荐将所有成员变量写在构造函数中。但是实践中发现也可以在其他位置,但是必须先赋值,后访问(赋值即创建成员变量),否则会报错
- 函数中的变量必须要赋值后才算创建成功,如果仅是出现变量而不赋值,这个变量依然不存在
- 不同的对象成员变量可能是不同的。例如b对象,在没有执行fun1()时,就不存在val6,7的成员变量。
class TestClass():
val1 = 100 # 类变量
def __init__(self):
self.val2 = 200 # 成员变量
self.fun()
def fun(self):
self.val3 = 300
val4 = 400 # 局部变量
def fun1(self, val=400):
val5 = 500 # 局部变量
self.val6 = 600 # 成员变量
self.val7 # 成员变量,必须要赋值,否则这个变量依然不存在
a = TestClass()
a.fun1() # 删掉后val6,7报错
print(a.val1)
print(a.val2)
print(a.val3)
#print(a.val4) # 局部变量,报错
#print(a.val5) # 局部变量,报错
print(a.val6)
print(a.val7)
b = TestClass()
print(b.val6) # 报错
类的专有方法
__init__
: 构造函数,在生成对象时调用__del__
: 析构函数,释放对象时使用__repr__
: 转换为字符串__str__
: 转换为字符串__setitem__
: 按照索引赋值__getitem__
: 按照索引获取值__len__
: 获得长度__cmp__
: 比较运算__call__
: 函数调用__add__
: 加运算__sub__
: 减运算__mul__
: 乘运算__truediv__
: 除运算__mod__
: 求余运算__pow__
: 乘方
函数的重载直接重写上面的方法即可。