#上下文协议:文件操作时使用with执行
# with open('a.txt','w',encoding='utf-8') as f1:
# with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法
# class Open:
# def __init__(self,name):
# self.name = name
# def __enter__(self):
# print('如果出现with语句,__enter__就被触发')
# def __exit__(self, exc_type, exc_val, exc_tb):
# print('with语句一旦执行完毕,__exit__就会被触发')
# with Open('a.txt') as f1:
# print('各种执行代码块')
# 如果出现with语句,__enter__就被触发
# 各种执行代码块
# with语句一旦执行完毕,__exit__就会被触发
########################################################################################################
# __exit__()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行
# class Open:
# def __init__(self,name):
# self.name = name
# def __enter__(self):
# print('如果出现with语句,__enter__就被触发')
# def __exit__(self, exc_type, exc_val, exc_tb):
# print('with语句一旦执行完毕,__exit__就会被触发')
# with Open('a.txt') as f1:
# print('各种执行代码块')
# raise AttributeError ('抛出一个超级异常')
# print('我就不会被执行了')
# 如果出现with语句,__enter__就被触发
# 各种执行代码块
# with语句一旦执行完毕,__exit__就会被触发
# Traceback (most recent call last):
# File "F:/Python/PythonLeaning/每日学习打卡/Day28.py", line 27, in <module>
# raise AttributeError ('抛出一个超级异常')
# AttributeError: 抛出一个超级异常
########################################################################################################
# class Open:
# def __init__(self,name):
# self.name = name
# def __enter__(self):
# print('如果出现with语句,__enter__就被触发')
# def __exit__(self, exc_type, exc_val, exc_tb):
# print('with语句一旦执行完毕,__exit__就会被触发')
# return True #执行时即使报错也当错误不存在
# with Open('a.txt') as f1:
# print('各种执行代码块')
# raise AttributeError ('抛出一个超级异常')
# print('我就会继续被执行了,因为__exit__被加了return True')
########################################################################################################
# 用途或者说好处:
# 1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
# 2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,
# 你无须再去关系这个问题,这将大有用处
########################################################################################################
# NameError:异常类-->class
# name 'asda' is not defined-->异常值
# Traceback -->追溯信息
########################################################################################################
#描述符
# 一、描述符本身应该定义成新式类(继承了object类),被代理的类也应该是新式类
# 二、必须把描述符定义成这类的类属性,不能低昂一道构造函数中
# 三、要严格遵循优先级
# python是弱类型语言:不用定义变量的类型就可以使用
# def test(x):
# print('---->',x)
# test('a')
# test(1)
# 为python加上类型检测:
# class Typed:
# def __init__(self,key,excepted_type):
# self.key= key
# self.excepted = excepted_type
# def __get__(self, instance, owner):
# print('get方法')
# # print('instance 参数【%s】'%instance)
# # print('owner 参数【%s】'%owner)
# return instance.__dict__[self.key]
# def __set__(self, instance, value):
# print('set方法')
# # print('instance 参数【%s】'%instance)
# # print('value 参数【%s】'%value)
# # print('---->',instance)
# if not isinstance(value,self.excepted):
# print('你传入的类型不是字符串,错误')
# return
# else:
# instance.__dict__[self.key] = value
# class People:
# name = Typed('name',str)
# age = Typed('age',int)
# # age = Typed('age')
# def __init__(self,name,age,salary):
# self.name = name #触发的是被代理,而不是实例化
# self.age = age
# self.salary = salary
# # p1 = People('panda',18,2100.1245)
# p2 = People(9527,18,29213)
# # print(p1.name)
# # p2 = People(1,10,20)
# # print(p1.__dict__)
# # print(p1.name)
# print(p2.name)
########################################################################################################
# 类的装饰器原理
# def deco(obj):
# print('----------->>>>',obj)
# obj.x = 1
# obj.y = 2
# obj.x = 3
# return obj
# # @deco #dtest = deco(test)
# # def test():
# # print('test函数运行')
# # test()
# @deco #Foo = deco(Foo)
# class Foo:
# pass
# f1 = Foo()
# print(Foo.__dict__)
########################################################################################################
# def Typed(*args,**kwargs):
# def deco(obj):
# print('---->>',kwargs)
# print('---->>', obj)
# for key ,val in kwargs.items():
# setattr(obj,key,val)
# return obj
# print('==>',kwargs)
# return deco
# @Typed(x = 1,y = 2,z = 3)
# class Foo:
# pass
# print(Foo.__dict__)
# @Typed(name = 'egg')
# class Bar:
# pass
# 用装饰器为类增加一个数据属性
########################################################################################################
# 再看property
# 一个静态属性property本质就是实现了get,set,delete三种方法
# class Lazyproperty:
# def __init__(self,func):
# self.func = func
# def __get__(self, instance, owner):
# print('我是get方法')
# if instance is None:
# return self
# res = self.func(instance)
# setattr(instance,self.func.__name__,res)
# return res
# class Room:
# def __init__(self,name,width,length):
# self.name = name
# self.width = width
# self.length = length
# @ Lazyproperty #area = property(area) 给Room添加了一个类对象
# def area(self):
# return self.width * self.length
# @property #test = property(test)
# def area1(self):
# return self.width * self.length
# @property
# def test(self):
# return ('返回一个值')
# r1 = Room('toilet',1,2)
# #实例调用
# # print(r1.area)
# # print(Room.__dict__)
# # 类调用
# #print(Room.area)
# print(r1.area)
# print(r1.__dict__)
# print(r1.area)
# print(r1.area)
# print(r1.area)
# print(r1.test)
#函数运行时要把实例本身传入,而不是类
#描述符用来代理类的属性
# 类调用的instance传入的是None,实例调用的instance传入的是self
########################################################################################################
# 延迟计算的功能:对于已经运行的函数,将结果存储在内存中,下一次调用方法的时候就不再运行函数而是直接调用
# (本质就是把一个函数属性利用装饰器原理做成一个描述符:类的属性字典中函数名为key,value为描述符类产生的对象)
# 描述符是很多高级库和框架的重要工具之一,描述符是通常使用到装饰器或者元类的大型框架中的一个组件
# class Foo:
# @property
# def AAA(self):
# print('get的时候运行我')
# return self
# @AAA.setter
# def AAA(self,value):
# print('set的时候运行我',value)
# @AAA.deleter
# def AAA(self,value):
# print('delete的时候运行我')
# f1 = Foo()
# f1.AAA = 'aaa'
########################################################################################################
# class Foo:
# def get_AAA(self):
# print('get的时候运行我')
# return self
# def set_AAA(self,value):
# print('set的时候运行我')
# def del_AAA(self):
# print('delete的时候运行我')
# AAA = property(get_AAA,set_AAA,del_AAA)
# # 只有属性在AAA定义property后才能定义AAA,setter,AAA,delete
# f1 = Foo()
# f1.AAA = 'aaa'
########################################################################################################
# metaclass--->元类
# class Foo:
# pass
# f1 = Foo() #f1是通过Foo实例化对象
# python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载class的时候就会创建一个对象
# (这里的对象指的是类而非类的实例)
# f1是Foo这个类产生的对象,而Foo本身也是对象
# print(type(f1))
# print(type(Foo))
#————————————————————————————————————————————————————#
# 什么是元类?
# 元类是类的类,是类的模板
# 元类是用来控制如何创建类的,正如类是创建对象的模板一样
# 元类的实例为类,正如类的实例对象(f1对象是Foo类的一个实例,Foo类是type类的一个实例)
# type是python的一个內建元类,用来控制生成类,python中任何class定义的类其实都是type实例化的对象
# type(类名,object,属性字典)
# class Foo:
# def __init__(self,name):
# self.name = name
# pass
# print(Foo)
# def __init__(self,name,age):
# self.name = name
# self.age = age
# FFo = type('FFo',(object,),{'x':1,'__init__':__init__})
# print(FFo)
# print(FFo.__dict__)
# f1 = FFo('alex',19)
# print(f1.name)
# class MyType(type):
# def __init__(self,a,b,c):
# print('元素的构造函数执行')
# # print(a)
# # print(b)
# # print(c)
# def __call__(self, *args, **kwargs):
# print('====>')
# print(self)
# print(*args,**kwargs)
# obj = object.__new__(self)
# self.__init__(obj,*args,**kwargs) #实际在执行Foo.__init__()
# class Foo(metaclass=MyType): #type('Foo',(object),{}) MyType传入了4个参数
# def __init__(self,name):
# self.name = name
# f1 = Foo('OneName')
# 练习一:在元类中控制把自定义类的数据属性都变成大写

Pyhton学习——Day28的更多相关文章

  1. Pyhton学习——Day26

    #多态:多态指的是一类事物有多种形态# import abc# class Animal(metaclass = abc.ABCMeta):# 同一类事物:动物# @abc.abstractclass ...

  2. pyhton 学习

    官方学习文档 https://docs.python.org/3/tutorial/

  3. 20190320_head first pyhton学习笔记之构建发布

    1.把代码nester.py放入文件夹nester中,在文件夹中再新建一个setup.py文件,文件内容如下: from distutils.core import setup setup( name ...

  4. Pyhton学习——Day2

    Python开发IDE(工具)Pycharm.eclipse1.循环while 条件 #循环体 #条件为真则执行 #条件为假则执行break用于退出所有循环continue用于退出当前循环 2.Pyc ...

  5. Pyhton学习——Day27

    # hasattr(obj,'name')-->obj.name# getattr(obj,'name',default = 'xxx')--->obj.name# setattr(obj ...

  6. Pyhton学习——Day25

    #面向对象的几个方法#1.静态方法@staticmethod,不能访问类属性,也不能访问实例属性,只是类的工具包#2.类方法:@classmethod,在函数属性前加上类方法,显示为(cls)代表类, ...

  7. Pyhton学习——Day24

    # #面向对象设计:# def dog(name,gender,type):# def jiao(dog):# print('One Dog[%s],wfwfwf'%dog['name'])# def ...

  8. Pyhton学习——Day23

    #re模块方法:findall search#findall:返回所有满足匹配条件的数值,放在列表里#search : #函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象 ...

  9. Pyhton学习——Day22

    #有缩进的代码表示局部作用域的代码#if_name_ =='_main_' # while True#先引入一个os模块import os,sys,time,json# print(os.path.d ...

随机推荐

  1. Teradata在大数据管理与分析领域连续18年评测排名第一

    Gartner 魔力象限介绍 Gartner(高德纳)全球最具权威的IT市场研究与顾问咨询公司,他总是不停地推出IT行业的各种报告以及著名的Gartner魔力象限. Gartner魔力象限通常从两个方 ...

  2. 01.Python基础-4.字符串

    1 字符串初识 字符串编码 字符串定义:多个字符(双引号或单引号中的数据)组成 字符串下标 类似列表list 格式化 就是占位符 最常用%s %d %f等等 转义字符 转义字符 描述 \ (在行尾时) ...

  3. CDH版本hadoop2.6伪分布式安装

    1.基础环境配置 主机名 IP地址 角色 Hadoop用户 centos05 192.168.48.105 NameNode.ResourceManager.SecondaryNameNode. Da ...

  4. 怎样在Java中运行Hive命令或HiveQL

    这里所说的在Java中运行Hive命令或HiveQL并非指Hive Client通过JDBC的方式连接HiveServer(or HiveServer2)运行查询,而是简单的在部署了HiveServe ...

  5. kentico中的page template的使用

    父页面使用自己的template 子页面,也使用自己的template. 然后父页面中需要添加一个place holder. 子页面的继承,选择inherit only master page. 这样 ...

  6. nyoj--118--修路方案(次小生成树)

    修路方案 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路. ...

  7. BZOJ 1806 DP

    思路: f[i][a][b][c][d] 表示在第i天 昨天1矿吃的是a 前天1矿吃的是b 昨天2矿吃的是c 前天2矿吃的是d 的最优解 暴力转移 哦 需要优化一下空间- 变成i%2 就好了 //By ...

  8. C# 实现透明可移动窗体

    1.设置窗体属性 this.BackColor this.TransparencyKey = this.BackColor; 2.窗体加载图片 this.BackgroundImage = globa ...

  9. autocomplete for password

    <input id="userPassword" type="password" autocomplete="current-password& ...

  10. struts2学习之基础笔记3

    第8章Struts 2类型转换 使用类型转换器 自定义类型转换器 步骤:1. Struts 2 构建流程 2.自定义类型转换器类(继承 DefaultTypeConverter /StrutsType ...