python知识总结:
(1)、 if name == “main”:
我们将它当做应用程序的入口,name将不再是它本身模块名称,而强制改为__mian__
if name == ‘main’ 就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 name 的值。
通俗的理解__name__ == ‘main’:假如你叫小明.py,在朋友眼中,你是小明(name == ‘小明’);在你自己眼中,你是你自己(name == ‘main’)。
if name == 'main’的意思是:当.py文件被直接运行时,if name == 'main’之下的代码块将被运行;当.py文件以模块形式被导入时,if name == 'main’之下的代码块不被运行。
一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在if name == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。
(2)、self用法:
由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Student类时,把name、score等属性绑上去:
class Student(object):
def init(self, name, score):
self.name = name
self.score = score
__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去。
(3)、构造方法:
在Python中是使用__new__和__init__来完成的。
__new__负责进行对象的创建,object中的__new__示例代码如下
@staticmethod # known case of new
def __new__(cls, *more): # known special case of object.__new__
“”" Create and return a new object. See help(type) for accurate signature. “”"
pass
__init__负责进行对象的初始化,object中的__init__示例代码如下:
def init(self): # known special case of object.init
“”" Initialize self. See help(type(self)) for accurate signature. “”"
pass
(4)、公有和私有:
- _xxx "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问
- __xxx 类中的私有变量/方法名 " 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
- x 系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 init()代表类的构造函数。
如果想要直接访问私有变量和私有函数,解释器会报错说类里没有这个属性
但是python的私有其实是伪私有,其实是python的名字改装在起作用,在类外访问类里的私有元素,变量和方法会被改名,加上_<类名>即可访问私有变量和私有方法
(5)、闭包:
闭包(Closure)指的则是附带相应数据的函数。闭包函数能够引用一些并不在当前代码上下文中定义的变量。这些被引用的变量是在闭包函数的包围作用域(enclosing scope)的代码中定义的。这样的一些函数被称为闭包。
1.定义:本质上来说,就是一个函数里嵌套一个函数定义,内部函数能够带够调用外部函数的变量以及外部函数的传入参数。闭包的大概形式列如:
def test1(a,b):
pass
def test2©:
pass
return test
调用
test_1 = test1(a,b)
test_1©
2.概述:
上述代码return返回的是一个指向,指向test2这个函数,调用闭包时会开辟一个存储空间来存储变量和函数,调用一次就开辟一次。调用后,会将函数与数据一起传给test_1这个变量。实质上test_1这个变量就是指向test2函数的内部。
3.内部函数修改外部函数数据内部函数开始要用nonlocal 变量名来定义外部函数内内部函数外的变量:如:
def test1(a,b):
x = 300
def test2©:
nonlocal x
print(-----1---->%d)% x
x = 20
print(------2------>%d)%x
return test
assert利用蚁剑登录:
使用中国蚁剑配置木马连接信息
蚁剑具有“代理设置”功能,此处为了直接使用 BurpSuite 观察蚁剑与服务端的通信过程的数据包,我们启用下蚁剑的代理功能:
打开靶机的虚拟终端
此时可以在 BurpSuite 上捕抓到对应的通信数据包:
数据包头“cmd”是木马的连接密码。可以看到中国蚁剑默认状态下的通信数据包仅仅做了URL编码处理,与明文无异。