Python中的作用域(或者说上下文)
python这种混杂类型语言(动态类型\解析执行),采用了分离作用域的方式来避免重名问题,让我们能够更好的组织程序代码的结构,直观上来讲Python分为以下几种作用域:
1.包(Package):
包含一些模块,需要包含一个__init__.py模块,该包才能被Python Interpreter识别并加载。直白点讲包就是包含了一些模块的文件夹。
2.模块(module)
在Python中所谓模块(module)就是一些可以被Python Interpreter解析执行(因为预编译的存在这么说不是太准确)的文件,
如a.py之类(虽然说其他后缀也可以被执行, 但是习惯上还是用py做后缀)
3.类(class)
就是在各个模块中定义的class。当然,我们也可以在class中定义class。
4.函数(function)
函数作用域中也可以定义函数。
Python中的函数
我们按作用域来谈一谈Python中的函数。
Package作用域中的函数
没错,Package中的函数就是特殊模块__init__.py中定义的函数,python的函数与抽象意义上的数学函数很相似,都有返回值,
即使不用return返回点什么,python的函数也会返回一个None
目录结构如下图所示:
在demo目录中创建__init__.py,并定义一个函数,__init__.py内容如下:
def packageMethod(args):
print 'invoke method defined in init file',args
test.py内容如下:
#!/usr/bin/env python
import demo
if __name__=='__main__':
demo.packageMethod('aaa')
运行一下test.py可以看到结果。
模块中的函数
__init__.py属于特殊模块,Python解释器会自动引入某个包下的__init__.py。这里所说的模块是除了__init__.py这个高富帅之外的其他屌丝模块。
模块中可以定义函数也可以定义类,模块中的函数可以被本模块中的其他函数以及类使用。
我们在demo目录下再出创建一个utils.py,内容如下:
#!/usr/bin/env python
#*-*coding:UTF-8*-*
def trim(word):
result = str()
for c in word:
if c == ' ':
continue
result += c
return result
test.py中内容变为:
#!/usr/bin/env python
import demo
import demo.utils as utils
if __name__=='__main__':
#demo.packageMethod('aaa')
word = utils.trim('| aa |')
print word
运行test.py可得结果。
类(class)中的函数
在类中可以定义三种方法,实例方法、staticmethod、classmethod
1.实例方法只能通过类的实例进行调用,第一个参数是self指针
2.staticmethod可以通过类以及类实例调用,参数无特殊要求
3.classmethod可以通过类以及类实例进行调用,第一个参数是定义该方法的类的类型对象(在python里类也是对象)
在utils.py中定义一个class,代码如下:
#!/usr/bin/env python
#*-*coding:UTF-8*-*
def trim(word):
result = str()
for c in word:
if c == ' ':
continue
result += c
return result
class StringUtils(object):
def __init__(self):
pass
def instance_trim(self,word):
print 'invoke instance function'
return trim(word)
@staticmethod
def static_trim(word):
print 'invoke static function'
return trim(word)
@classmethod
def class_trim(cls,word):
print 'invoke class function'
print cls
return trim(word)
test.py内容变为:
#!/usr/bin/env python
#*-*coding:UTF-8 *-*
import demo
from demo.utils import StringUtils
if __name__=='__main__':
#通过实例调用
util = StringUtils()
print util.instance_trim('| aaa |')
print util.static_trim('| aaa |')
print util.class_trim('| aaa |')
#通过类调用
print StringUtils.static_trim('| aaa |')
print StringUtils.class_trim(' aaa ')
运行test.py可得结果。
函数中的函数以及类中的类
例子如下:
#!/usr/bin/env python
def outer_func():
print 'outter_func'
def inner_func():
print 'inner_func'
inner_func()
class OuterClass(object):
def __init__(self):
pass
def create_innerclass(self):
inner = OuterClass.InnerClass()
class InnerClass(object):
def __init__(self):
pass
if __name__== '__main__':
outer_func()
outer = OuterClass()
outer.create_innerclass()