Python 面向对象之五 基础拾遗
Python 面向对象之五 基础拾遗
今天呢,就剩下的面向对象的相关知识进行学习,主要会学习以下几个方面的知识:1.上下文管理协议,2.为类加装饰器 3.元类
一、上下文管理协议
在学习文件操作的时候对于一个文件的操作是这样的:
with open('文件名','模式')as f:
'代码块'
上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法
class Foo:
def __init__(self,name):
self.name=name def __enter__(self):
print('执行enter')
return self def __exit__(self, exc_type, exc_val, exc_tb):
print('执行exit')
print(exc_type)
print(exc_val)
print(exc_tb)
return True with Foo('a.txt') as f: #f为Foo的一个实例化对象,(可以类似的想象成f = Open('a.txt))
# 执行 with Foo('a.txt') as f 就会触发Foo类中的__enter__方法 此方法把self作为返回值传递给f
#with 代码块中的代码执行完毕后就会触发__exit__方法
print(f) #<__main__.Foo object at 0x01EC2070>
print(asdfsaasdfasdfasdfasdfasfasdfasdfasdfasdfasfdasfd) #代码块有异常就
# 会直接触发__exit__方法,后面的代码块就会报错,若在__exit__方法中有返回值则会把错误信息吞掉,
print(f.name)
print('-----------------')
print('-----------------')
print('-----------------')
print('-----------------')
print('-----------------')
print('-----------------')
print('-----------------')
print('') #先执行__exit__方法后,再执行此句
用途或者说好处:
1.使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须手动干预
2.在需要管理一些资源比如文件,网络连接和锁的编程环境中,可以在__exit__中定制自动释放资源的机制,你无须再去关系这个问题,这将大有用处
二、为类加载装饰器
在学习函数的时候就学习过装饰器,现在在学习面向对象的时候还在讲装饰器,在类中装饰器是这么玩儿的呢?我们首先必须要有一个认识那就是:类与函数都是对象,so,那我们再来了解一下装饰器的符号@ ,在一个函数也好,在一个类也好上面加上装饰器是想表达上面意思呢?
# @名字————>其意义就在于它不会管装在什么上面,都是把他们当做对象来处理
# eg:@echo 此句的执行就相当于:teacher = echo(teacher)
# def teacher()
# @echo 此句执行就相当于:Student = echo(Student)
# calss Student()
我们先来举一个函数的例子说明一下:
def decho(func):
print('===========')
return func @decho #执行此行相当于==> test = decho(test)
def test():
print('..............') test() 得到的结果为:
===========
..............
再来举一个面向对象的例子:
def test(obj):
print('======>',obj)
obj.name='alex'
obj.age=45
obj.gender='male'
return obj
@test # 相当于执行了Foo = test(Foo)
class Foo():
pass print(Foo.__dict__)
print(Foo.name) 输出的结果为:
======> <class '__main__.Foo'>
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None, 'name': 'alex', 'age': 45, 'gender': 'male'}
alex
最后再写一个带参数的装饰器的例子:
def MO(**kwargs):
def test(obj):
print('---->',obj)
for k ,v in kwargs.items():
setattr(obj,k,v)
return obj
print('==================>',kwargs) #==================> {'name': 'alex', 'age': 45, 'gender': 'male'}
return test @MO(name='alex',age=45,gender='male')
class Teacher():
print('___>')
pass print(Teacher.__dict__) @MO(name='houliangong')
class Studet():
print('wangbadan') print(Studet.__dict__) 输出的结果为:
==================> {'name': 'alex', 'age': 45, 'gender': 'male'}
___>
----> <class '__main__.Teacher'>
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Teacher' objects>, '__weakref__': <attribute '__weakref__' of 'Teacher' objects>, '__doc__': None, 'name': 'alex', 'age': 45, 'gender': 'male'}
==================> {'name': 'houliangong'}
wangbadan
----> <class '__main__.Studet'>
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Studet' objects>, '__weakref__': <attribute '__weakref__' of 'Studet' objects>, '__doc__': None, 'name': 'houliangong'}
三、元类
啥是元类?元类的意思即是类的类,是创建类的模板,用他就可以创建出类来,so,这么强大是不是得学习一下。
元类是用来控制如何创建类的,正如类是创建对象的模板一样
元类的实例为类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)
type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象
创建元类的两种模式:
方式一:
1 class Foo:
2 def func(self):
3 print('from func')
方式二:
1 def func(self):
2 print('from func')
3 x=1
4 Foo=type('Foo',(object,),{'func':func,'x':1}) #type创建类的时候是需要输入三个参数的第一个为创建的类名,第二个参数为属于那个类用元组来表示,第三个参数为传入的数据属性用字典的类型表示
一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用户也可以通过继承type来自定义元类(顺便我们也可以瞅一瞅元类如何控制类的创建,工作流程是什么)
好,那我们自定义一个元类:
class Mytype(type):
def __init__(self,class_name,bases=None,dict=None):
print("Mytype init--->")
print(class_name,type(class_name))
print(bases)
print(dict) def __call__(self, *args, **kwargs):
print('Mytype call---->',self,args,kwargs)
obj=self.__new__(self)
self.__init__(obj,*args,**kwargs)
return obj class Foo(object,metaclass=Mytype):#in python3
#__metaclass__ = MyType #in python2
x=1111111111
def __init__(self,name):
self.name=name def __new__(cls, *args, **kwargs):
return super().__new__(cls)
# return object.__new__(cls) #同上 f1=Foo('name')
print(f1.__dict__)
今天就写到这里了,有点累了!
Python 面向对象之五 基础拾遗的更多相关文章
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)
面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...
- Python 面向对象(一) 基础
Python 中一切皆对象 什么是面向对象? 面向对象就是将一些事物的共有特征抽象成类,从类来创建实例. 类class 可以理解为模版 比如人类,都具有身高.体重.年龄.性别.籍贯...等属性,但属性 ...
- python面向对象编程基础
演示了 Python 类与对象的编程基础, 包括属性.方法.继承.组合.动态创建类. python 版本: 2.7.5 class SimpleClass(object): ''' a simple ...
- python——面向对象(1),基础
"""面向对象:抽象化编程思想.类,对象:用类来创建(实例化)对象.类:一系列特征和行为相同的事物总和, 1.属性:特征 2.行为:方法 定义类 :PEP 8要求标识符的 ...
- Python 细节与基础拾遗
locals():当前环境下的全部局部变量,字典(dict)类型,所有的 key 均为字符串类型: if 'sess' in locals() and sess is not None: print( ...
- Python 面向对象 基础
编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...
- python学习第十四天 -面向对象编程基础
python也是支持面向对象编程的.这一章节主要讲一些python面向对象编程的一些基础. 什么是面向对象的编程? 1.面向对象编程是一种程序设计范式 2.把程序看做不同对象的相互调用 3.对现实世界 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
随机推荐
- RocketMQ事务消息学习及刨坑过程
一.背景 MQ组件是系统架构里必不可少的一门利器,设计层面可以降低系统耦合度,高并发场景又可以起到削峰填谷的作用,从单体应用到集群部署方案,再到现在的微服务架构,MQ凭借其优秀的性能和高可靠性,得到了 ...
- Tomcat基本知识(一)
顶层架构先上一张Tomcat的顶层结构图(图A),如下: Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务 ...
- Java描述设计模式(15):责任链模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...
- SystemMetrics
头文件: #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))struct { int iIndex ; TCHAR ...
- 部署在本服务器上,Jenkins无法启动Tomcat
今天在部署Jenkins的过程中,有一个需要部署在本服务器上的Web服务,而且Jenkins给我的反馈也是成功的部署了,且Tomcat启动起来了,但是实际打开项目发现其实并没有启动起来 在查看日志的时 ...
- 【Spring Cloud】客户端负载均衡组件——Ribbon(三)
一.负载均衡 负载均衡技术是提高系统可用性.缓解网络压力和处理能力扩容的重要手段之一. 负载均衡可以分为服务器负载均衡和客户端负载均衡,服务器负载均衡由服务器实现,客户端只需正常访问:客户端负载均衡技 ...
- std::shared_future/future
std::future提供了一种访问异步操作结果的机制.
- libevent::实现的低级 socket
LibEvent 实现的低级 ROT13 例子 #include <cstdio> #include <netinet/in.h> #include <sys/socke ...
- vue3.0 + ueditor
公司有个需求,需要做个发送邮件的模版(富文本对于模版的扩展性更好吧) 关于富文本,也找了一些好看且支持vue的,但是功能都没有百度全面 反正这个系统也是自己人用,颜值无所谓了 关于vue2.0+ued ...
- php架构师都要会什么
架构师的成长离不开踩坑,不断试验各种方案,各种踩坑,从小坑到大坑,逐渐归纳.另外就是多学习多交流,兼收并蓄,不用特别在意细节,观其大略,了解常见的各种东西的核心价值与短板所在.一个程序和计算系统软件体 ...