python基础知识10-描述器和装饰器
课前的解答
1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出
w:保存
wq 保存退出
q!:强制退出
shift + zz:保存退出
x:保存退出
2.推荐大家两款软件:向日葵(远程控制软件),网易有道词典,Python官方文档
3.函数名首字母不要大写,类名是要大写,这都是约定俗成的东西(规范) 函数跟类取名的时候
class Apple: # 苹果类 pass
4.递归,首先第一点,我们用的不多,计算量大,慢.第二点,没有好好捋一遍(递归是有深度的)
5.不明白的时候先去自己按照代码执行顺序走一遍,不要去钻牛角尖。
6.我课上讲的时候,大家尽量的不要去跟着我敲,先把思路理清楚,先听明白了再讲其他的
7.我们现在学的基础,很多东西都是固定的,def,范式
1.new方法与单例模式
--new--()方法实现单例模式,只能实例化一个对象.重复实例的id是一样的.
实例化时候最先调用--new--()方法,然后执行--init--()方法.
class Earth(object): #python2中写object , 旧式类
def --new--(cls,*args,**kwargs): #cls代表类本身.
if not hasattr(cls,'instance'):
cls.instance = super().--new--(cls) #把父类的new方法继承到instance属性中
return cls.instance
def --init--(self): #self实例本身.
self.name = 'earth'
普通的类实例化一次就会开辟一个新的内存空间.
2.定制属性访问
python中一切皆对象.
查:
hasattr(re,'length') 返回bool值,判断有没有这个属性.
getattr(re.'length') 返回属性值
b.--getattribute--('length') #返回属性值
增:
b.aaa =1
setattr(b,'bbb',2)
b.--setattr--('ccc',3)
改:
setattr(b,'length',6)
b.--setattr--('length',5) 底层调用这个魔方方法.
删:
delattr(b,'ccc')
b.--delattr--('bbb') 底层调用这个魔方方法.
del b
def --getattr--(self,item):
print('no attribute') # 重写魔法方法,当属性不存在时,如果定义了此方法,则调用方法.改变报错为打印这句话.
3.描述符
如果在一个类中实例化另一个类,对这个属性进行访问的时候怎么做的?
class MyAttribute:
def --get--(self,instance,owner):
print('get')
def --set--(self,instance,value):
print('set')
def --delete--(self,instance):
print('del')
class MyClass:
m = MyAttribute() #在另一个类里面实例化了外面的类. m 就是描述符
def --del--(self):
print('instance delete')
c = MyClass()
c.m #打印出了MyAttribute的--get--()方法里面的内容.
c.m = 1 #打印出了MyAttribute的--set--()方法里面的内容.
del c.m #打印出了MyAttribute的--delete--()方法里面的内容.
在类里面定义另一个类,对这个实例做访问时,需要定义 --get-- --set-- --delete--方法.
4.装饰器
闭包:函数里面嵌套函数,返回内层函数的函数体.
装饰器的作用:给原有的函数添加新的功能.在不修改以前的代码的前提之下去添加.
def func1(func):
def func2(y):
print('func2 is running')
return func(y) + 1
return func2
def gun(m):
print('gun is running')
return m * m
@func1
def deco(m):
print('deco is running')
return m * m
print(deco(2))
在原有的基础上加了1
内置装饰器 @property #原本要加括号调用.就像访问属性一样
示例:
class Rectangle:
def --init--(self,length,width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
return areas
a = Rectangle(3,4)
print(a.area()) 变为 print(a.area),加property变的直接可以调用,不加括号.像访问属性一样.
@staticmethod #静态方法,没法访问类里面的类属性跟类参数方法了,但是可以不加self.相当于变成函数的效果.
类里面定义一个方法:
def func(): .
print(self.width)
@classmethod #类方法
def func1(cls):
print(cls.name)
原本是 类名.name. 加了类方法直接用cls.name代替.
类也可以当作装饰器.但需要定义call方法
class TestClass:
def --init--(self,func):
self.func = func
def --call--(self, *args , **kwargs):
print('--正在添加功能--')
return self.func()
@TestClass
def fun():
print('正在运行程序')
func()
python基础知识10-描述器和装饰器的更多相关文章
- python基础学习之描述符和装饰器
描述符的了解: 描述符协议: python描述符是一个"绑定行为"的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有: __get__, __set__, 和__ ...
- python基础知识---迭代器、生成器、装饰器
一.迭代器 二.生成器 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html def func(): #定义生成器,和普通函数的区别是 ...
- python基础语法7 闭包函数与装饰器
闭包函数: 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套.函数对象.名称空间与作用域 结合体. # 直接传参 def func(x): print(x) f ...
- Python 基础之面向对象之八步理解装饰器
装饰器:在不改变原有代码的情况下,为该原函数扩展新功能特征:返回新函数,替换旧函数语法:@ 语法糖 1.装饰器原型 #例1: def kuozhan(func): def newfunc(): ...
- Python基础之函数的闭包与装饰器的介绍
1.闭包的概念: 如果在一个函数中,定义了另外一个函数,并且那个函数使用了外面函数的变量,并且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包. 2.话不多说,以demo示例: de ...
- 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范
1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...
- Python基础4 迭代器,生成器,装饰器,Json和pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- python基础之迭代器、生成器、装饰器
一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...
- python基础之:九步认识装饰器
step1. 先看个代码吧: def f(): ') f=lambda a:a +100 #覆盖上面的函数f print(f) #函数名指函数所在内存中的位置,入带后面括号表示执行函数 print(f ...
- python基础-第五篇-5.3装饰器
小白发呆的看着窗外,同事们陆陆续续的地来到公司,想起算法,小白就飘飘然了.突然后面传来一声呼唤,原来是小刘! 小刘:不好意思啊!堵车了,就来晚了点,不耽误你的时间,咱们就开启的今天的培训内容吧! 小白 ...
随机推荐
- [USACO10FEB]购买巧克力Chocolate Buying 【假背包真贪心】 By cellur925
题目传送门 继续dp刷题计划,看到这道题,第一眼感觉不就是显然的完全背包嘛.把背包打完要开始填充数组大小的时候成为了mengbier,发现数据极大,达到了1e18.显然这不是一道平凡的背包题目. 于是 ...
- c++继承汇总(单继承、多继承、虚继承、菱形继承)
多重继承中,一个基类可以在派生层次中出现多次,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多分同名成员.C++提供虚基类的方法使得在 ...
- h5-35-ajax轮询实现推送效果
data.txt { "number1":1200, } index.html <!DOCTYPE html> <html> <head> &l ...
- 当document.write 遇到外联script
先来看个例子: <!DOCTYPE html> <html> <head> <title>测试 document.write</title> ...
- F. Anton and School 位运算 + 化简
http://codeforces.com/contest/734/problem/F 因为 x + y = (x & y) + (x | y) 有了这个公式后,然后应该手动模拟一下,把公式化 ...
- Apache下禁止使用IP直接访问本站的配置方法
现在管的严啊,上面要求不能使用IP直接访问服务器,把apache配置做下调整就行了.方法如下: 打开apache的配置文件 # vi /usr/local/apache2/conf/extra/htt ...
- Jenkins+Ant+Jmeter搭建轻量级接口自动化
软件准备 本文所用软件版本如下: Jenkins2.176.1 Tomcat9.0.21 Ant1.9.14 Jmeter5.1.1 我已经把相应的软件上传到我的网盘中,下载地址如下: 下载链接:ht ...
- iOS 网络开发
http://www.cnblogs.com/kenshincui/p/4042190.html
- Selenium私房菜系列--总章
前言 在这段期间,我一直在找关于服务器的端测试方案,自动化工具等等,无意间我发现了Selenium这个工具.在试用一段时间后,觉得Selenium确实是一个很不错的Web测试工具.在和强大的QTP比较 ...
- 千万千万不要运行的 Linux 命令
文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统.所以不在root等高级管理权限下执行命令是很好的习惯. 早晚有一天 ...