关闭

14.执行环境

271人阅读 评论(0) 收藏 举报
分类:

1、python可以运行操作系统的命令,这个嘛,确实厉害啊。


2、python的4种可调用分类:函数、方法、类、以及类的实例对象


a、函数:python主要分为3种类型的函数  (python中一样 everything is object,一切都是实例对象,所以函数的类型通过type()函数看到

第一种:内建函数或者叫内置函数(BIFs)builtin_function(你也可以理解成python自己写好的函数),内建函数在_bulitin_模块里哦

下面是内建函数(BIFs)的一些常见属性


__doc__ :代表的是内置函数的api文档吧,算,哈哈

__name__ : 内置函数名字,字符串类型哈

__self__ :  设置为None(保留给built-in 方法)

__module__ :存放内建函数的模块的名字, 必然是__builtin__


你还可以使用dir()函数,传入函数名字,会返回一个函数所拥有的所有属性的List

>>> dir(dir)
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
dir函数,再查看dir函数有哪些属性……,呵呵,别晕了


让我们再用type函数看看dir的类型

>>> type(dir)
<type 'builtin_function_or_method'>
……………………………………………………………………………………华丽丽的分割线…………………………………………………………………………………………………


第二种:是咱们自己写的函数(称为用户定义的函数 UDF,全称为:User-Defined Function) 

定义在模块的最高级里面(就是没有空格字符,没有缩进)

也有默认的属性哦亲(自己查去吧dir(函数名字)):

udf.__doc__
udf.__name__
udf.func_code
udf.func_defaults
udf.func_globals
udf.func_dict
udf.func_doc
udf.func_name
udf.func_closure 


让我们看看自己创建的函数,函数类型是个啥(注意别混淆成返回值类型)

>>> def fkMe():
	pass

>>> type(fkMe)
<type 'function'>
哈哈,是 function 



第三种:匿名函数,嘿嘿,自己看吧

<span style="font-size:12px;"> >>> lambdaFunc = lambda x: x * 2
    >>> lambdaFunc(100)
    200
     >>> type(lambdaFunc)
     <type 'function'></span>

匿名函数也是自己自定义的函数哦,只是没有名字而已,所以内建的属性都有哦 __name__啦 等等

>>> type(lambda:1)
<type 'function'>
我就fk了,lambda,我用的太少了,这是我的缺点……………………

>>> lambadaFu = lambda x: x * 100
>>> lambadaFu.__name__
'<lambda>'



b、方法:python中的方法有几种?内建方法(英文简称BIMs,也叫内置方法,名称呵呵)、用户自定义的方法,目前就这两种


第一种:内建方法,比如List、元组、字典中定义的方法

>>> type([].append)
<type 'builtin_function_or_method'>
>>> type([])
<type 'list'>


这句户有价值:此外,BIM 和BIF 两者也都享有相同属性。不同之处在于BIM 的__self__属性指向一个Python
对象,而BIF 指向None



第二种:咱们自己写在类里的方法,UDM(User-defined method,用户定义的方法)



内建方法与自己写的方法也一样拥有内建属性:__doc__、__name__等等



c、类:用类创建实例对象

书上说:利用类的可调用性创建实例。还强调了类有一个默认的构造函数(里面啥也没做,就写了pass),当然你也可以自定义构造函数 __init__(xx, xx)

关于类的调用,就先说到这里吧……哈哈


d、类的实例对象,重写__call__这个特别方法,具体看下面吧(这里要注意加深理解,一定要明白这个__call__()方法是干嘛用的

牛逼,大写的牛逼,谁曾想,作者还能想到把实例对象,当作一个函数来用,我cao,牛逼

<span style="font-family:SimSun;">class Person(object):
    def __init__(self, personName):
        self.name = personName

    def __call__(self):
        return self.name
    

if __name__ == '__main__':
    p = Person("wang yuan wai")
    print p()</span>
输出结果:

wang yuan wai

当你使用p()时,会调用对应的__call__方法


插曲:callable()、


3、执行

比如我f5运行这个脚本

<span style="font-size:12px;">def temp():
    print("temp()")


temp() #这个会被执行,因为它处于最高级别(即没有缩进的代码)
</span>


4、导入模块,即会执行最高级别的代码(即没有缩进的代码)
例子: 
首先:新建一个import2.py 文件 就只有这么一行代码
<span style="font-size:12px;">print('loaded import2')
</span>

然后:新建一个import1.py文件,代码如下
<span style="font-size:12px;">import import2

print("import 1")
</span>

接着:执行import1.py文件
结果:

<span style="font-size:12px;">>>> 
loaded import2 #这里就是 import import2带来的作用,我们看到它执行了import2模块的语句
import 1 
>>> </span>

总结:导入模块的副作用是会执行所有最高级别的代码

5、将模块作为脚本执行(2.4版本后加入的东东)
例如:在cmd下执行import1模块
D:\temp>python import1.py

6、转载:__name__ == '__main__'的作用

很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = '__main__' 的作用,到底干嘛的?

有句话经典的概括了这段代码的意义:

“Make a script both importable and executable”

意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行

这句话,可能一开始听的还不是很懂。下面举例说明:

先写一个模块:

?
1
2
3
4
5
#module.py
defmain():
  print"we are in %s"%__name__
if__name__=='__main__':
  main()

这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出”we are in __main__“,说明我们的if语句中的内容被执行了,调用了main():

但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?

?
1
2
3
#anothermodle.py
frommoduleimportmain
main()

其执行的结果是:we are in module

但是没有显示”we are in __main__“,也就是说模块__name__ = '__main__' 下面的函数没有执行。

这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。

总结一下:

如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。

这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!



7、将模块作为脚本执行
windows下当然是以当前目录寻找这个【脚本文件名】
python 脚本文件名

8、结束执行
所有模块最高级的语句执行完毕后,python就结束执行了

9、这章我表现的不怎么样,继续加油吧…………








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:99649次
    • 积分:2937
    • 等级:
    • 排名:第12066名
    • 原创:185篇
    • 转载:62篇
    • 译文:6篇
    • 评论:21条
    最新评论