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

                         目录结构如下图所示:

                                           

根据分类的数据python python分类函数_根据分类的数据python

                         在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()