python函数进阶小结_python之路进阶总结(二)

本文详细介绍了Python编程中的几个关键概念:私有化,通过`__`前缀实现类似Java的私有属性;闭包,讲解了内部函数如何访问外部作用域的变量;装饰器,展示了如何使用装饰器来增强函数功能,包括多个装饰器的使用;动态添加属性和方法,演示了如何在运行时为对象和类添加新的属性和方法。此外,还涉及了LEGB查找规则和生成器的send()和next()方法。
摘要由CSDN通过智能技术生成

2018-9-15 17:14:47python进阶总结:1. python的私有化1. 在python中 __ 相当于java中的private,外部不能直接调用,只能用set,get烦恼歌发classTest(object):def __init__(self):

self.__num = 100

defsetNum(self,newNum):

self.__num =newNumdefgetNum(self):return self.__numnum= property(getNum,setNum) #使⽤property升级getter和setter⽅法

t =Test()print(t.getNum())

t.setNum(50)print(t.getNum())print("-"*50)

t.num= 200 #相当于调用了 t.setNum(200)

print(t.num) #相当于调用了 t.getNum()

2. 闭包 : 在一个函数内部又定义一个函数,内部函数调用外部函数的变量

内部函数中对enclosing作用域的变量进行引用。deftest(number):print("--1--")deftest_in(number2):print("---2--")print(number+number2)print("--3--")returntest_in#变量接受内部返回的函数引用 然后就相当于个函数了

ret = test(100)print("-"*50)

ret(1)3. 装饰器:1.装饰器就是对闭包的使用;2.装饰器用来装饰函数;3.返回一个函数对象,被装饰的函数接收;4.被装饰函数标识符指向返回的函数对象

多个装饰器,完成包裹数据#定义函数 :完成包裹数据

defmakeBold(fn):defwrapped():print("----------1----------")return ""+ fn() + ""

returnwrapped#定义函数:完成包裹数据

defmakeItalic(fn):defwrapped():print("----------2--------------")return "" +fn() +""

returnwrapped

@makeBold#test3 = makeBold(test3)

@makeItalic #test3 = makeItalic(test3)

deftest3():print("---------3-------------")return "hello world-3"ret=test3()print(ret)#-----1---------#------2------#------3-------#hello world-3

4.关于装饰器的Demo'''@ python特有的'''

#python不告诉你有重名函数

deftest1():print("test1")deftest1():print("test2")

只要是名都可以被改,名字仅仅是引用defw1(func):#定义一个闭包

definner():print("---正在验证权限---")

func()returninner

@w1#f1 = w1(f1)#等价于给人一种感觉,在没有修改f1()的前提下完成验证,这就是装饰器

deff1():print("----f1---")

@w1deff2():print("----f2----")

f1()

f2()#多个装饰器,定义函数,完成包裹数据

defmakeBold(fn):defwrapped():print("---1--")return "" +fn()+ ""

returnwrapped#定义函数:完成包裹数据

defmakeItalic(fn):defwrapped():print("--2--")return "" + fn() +""

returnwrapped'''装饰器什么时候进行装饰'''只要python解释器执行到这行代码时候就已经装饰完了

@makeBold

@makeItalicdeftest3():print("----3----")return "hello world-3"ret=test3()#在调用f1之前,已经进行装饰了

print(ret)'''带参数的装饰器'''

deffunc(functionName):print("---func--1---")def func_in(*args,**kwargs):#如果a,b没有定义,那么会到导致16行的调用失败

print("----func_in--1-")

functionName(*args,**kwargs)#如果没有把a,b当做实参进行传递,那么会导致调用12行的函数失败

print("---func_in--2-")print("----func-2-")returnfunc_in

@funcdeftest(a,b,c):print("-----test-a=%d,b=%d,c=%c---"%(a,b,c))

@funcdeftest2(a,b,c,d):print("------test-a =%d,b=%d,c%d,d=%d----"%(d,b,c,d))

test(11,22,33)

test2(44,55,66,77)'''装饰器对有返回值得函数'''

deffunc(functionName):print("--func_in--1------")deffunc_in():print("--func_in--1------")#保存返回的"haha"

xxxx = functionName() #z增加了一个变量存方法引用就可以解决返回值问题

print("-----func_in---2")returnxxxxprint("--func_in--2------")returnfunc_in

@funcdeftest():print("----test----")return "haha"ret=test()print("test return value is%s"%ret)5.LEGB原则

python中使用LEGB的顺序来查找一个符号对应的对象

locals->enclosing function-> globals ->builtins1.locals: 当前所在命名空间 (如函数,模块), 函数的参数也属于命名空间内的变量

enclosing: 外部嵌套函数的命名空间(闭包常见)deffun1():

a= 10

deffun2():#a 位于外部嵌套函数的命名空间

print(a)2.globals : 全局变量, 函数定义所在模块的命名空间

a=1

deffun():#需要通过 global 指令来声明全局变量

globala#修改全局变量, 而不是创建一个新的 local 变量

a =2

3. builtins: 内部模块的命名空间

python在启动的时候回自动为我们载入很多的内建的函数,类

比如 dict, list ,type,print, 这些都位于 __builtin__模块中可以使用 dir(__builtin__)来查看

这也是为什么我们在没有import任何模块的情况下

就能使用这么多丰富的函数和功能6. python动态添加属性和方法'''既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx ,

那么给对象添加⼀个⽅法 也是类似的 对象.⽅法名 = xxx

python动态添加属性以及方法

不用在程序大体变化情况下,实现改变功能'''

importtypes#动态添加属性

classPerson(object):def __init__(self,newName,newAge):

self.name=newName

self.age=newAge

laowang= Person("老王",10000)print(laowang.name)print(laowang.age)

laowang.addr= "北京....." #对象添加属性

print(laowang.addr)

laozhao= Person("老赵",18)#print(langzhao.addr)#Person.num =100#类添加属性

print(laozhao.num)#动态添加方法

classPerson2(object):def __init__(self,newName,newAge):

self.name=newName

self.age=newAgedefeat(self):print(".............%s正在吃"%self.name)defrun(self):print("------正在跑%s-------"%self.name)

p1= Person2("p1",10)

p1.eat()#虽然p1对象中run属性已经指向了 def run这个函数,,,但是这句代码还不正确#因为run属性指向的函数,是后来添加的,几 p1.run()的时候,并没有把p1挡做第#1个参数,导致了第10行的函数调用的时候,出现缺少参数的问题

#把实例方法绑到了对象那个身上

p1.run =types.MethodType(run,p1)

p1.run()#类方法,静态方法修改 其他的都是绑类身上 方法是给类添加的

@staticmethoddeftest():print("------这是一个静态方法____")

Person2.test=test

Person2.test()#动态修改类方法

@classmethoddefprintNum(cls):print("-------这是一个类方法-----")

Person2.printNum=printNum

Person2.printNum()#__slots__的使用!

classPerson3(object):#只允许添加一下类型的属性,不能随便添加

__slots__ = ("name","age")

p=Person3()

p.name="老王"p.age= 10

7. 生成器 : send()和next()#send()使用

deftest():

i=0while i<5:

temp= yield i #这个地方为空 temp 不传入东西就是 None

print(temp)

i+=1t=test()#先用__next()__运行一次 然后才能用send

t.__next__()

t.__next__()#send可以传入参数 然后 temp = "haha

t.send("haha")#yield多任务#只要足够的快 三个任务同时运行#看上去同时执行的事情都是多任务#协程,进程,线程

deftest1():whileTrue:print("---1---")yieldNonedeftest2():whileTrue:print("--2--")yieldNone

t1=test1()

t2=test2()whileTrue:

t1.__next__()

t2.__next__()2018-9-15 18:05:14day5.28 py网络编程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值