python day 11: 类的补充,元类,魔法方法,异常处理
python day 11
2019/10/14
学习资料来自老男孩与尚学堂
1. 类的补充
1.1 通过反射来查找类,创建对象,设置对象的属性与方法
#通过__import__输入字符串文件名的方式导入模块
m = __import__('getattr_setattr', fromlist=True)
if hasattr(m, 'Foo'):
# 去模块中找类
Foo = getattr(m, 'Foo')
# 根据类创建对象
obj1 = Foo()
# 通过对象找到对象的属性
n1 = getattr(obj1, 'n1')
# 通过反射找到对象的方法
show = getattr(obj1, 'show')
obj1.show()
print(obj1.n1)
# 通过反射设置对象的属性
setattr(obj1, 'name', 'lanxing')
print(obj1.name)
# 通过反射设置对象的方法
setattr(obj1, 'func1', lambda x: x + 1)
# def func1(x):
# return x + 1
# setattr(obj1, 'func1', func1)
print(obj1.func1(2))
1.2 类的魔法方法:getitem,setitem
class Foo(object):
def __init__(self, key):
self.key = key
def __call__(self, *args, **kwargs): # __call__定义类的对象可以当作函数来调用
return 1
def __getitem__(self, key): # obj['item'],obj[1:3]也是用的这种方法
if self.key:
return self.key
else:
return None
def __setitem__(self, key, value): # obj[key] = value
self.key = value
def __delitem__(self, key): # del obj[key]
pass
def __iter__(self): # for循环本质是调用了__itre_方法
yield 1
yield 2
# 本质上使用关键字class创建类时,就是调用了type函数来创建一个名为Foo的类。元组里面是父类,字典里面是类属性。
# r = Foo('item') # 执行__init__方法
# # print(r()) # 执行__call__方法
# r['item'] = 'lanxing' # r.__setitem__('item','lanxing')
# print(r['item']) # r.__getitem__('item')
# del r['item'] #
# print(r[1:3]) #
# r[1:3] = [11, 22, 33]
# del r[1]
print(Foo, type(Foo))
# print(r.__dict__) # 获取对象的所有属性与值,以字典形式返回
# {'key': [11, 22, 33]}
# print(Foo.__dict__) # 获取类的所有属性与值,以字典形式返回
'''
{'__module__': '__main__',
'__init__': <function Foo.__init__ at 0x0000020458CC08C8>,
'__call__': <function Foo.__call__ at 0x0000020458CC0950>,
'__getitem__': <function Foo.__getitem__ at 0x0000020458CC09D8>,
'__setitem__': <function Foo.__setitem__ at 0x0000020458CC0A60>,
'__delitem__': <function Foo.__delitem__ at 0x0000020458CC0AE8>,
'__iter__': <function Foo.__iter__ at 0x0000020458CC0B70>,
'__dict__': <attribute '__dict__' of 'Foo' objects>,
'__weakref__': <attribute '__weakref__' of 'Foo' objects>,
'__doc__': None}
'''
# for i in r: # 本质是调用了__iter__方法
# print(i)
# dic = dict(k1=11, k2=22)
# print(dic['k1'])
# del dic['k2']
# print(dic)
1.3 元类__metaclass__
元类的理解,这篇文章有助于理解元类。
使用元类
就是函数,方法调过来调过去,得使用几次才能理解元类。
class MyType(type):
def __init__(self, what, base=None, dict=None, *args, **kwargs):
super().__init__(what, base=None, dict=None, *args, **kwargs)
def __call__(self, *args, **kwargs):
obj = self.__new__(self, *args, **kwargs)
self.__init__(obj)
class classname(metaclass=MyType):
__metaclass__ = MyType # 声明其元类是MyType
def __init__(self, name, *args, **kwargs):
self.name = name
super().__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
return object.__new__(cls, *args, **kwargs)
# 第一阶段,解释器从上到下执行代码创建Foo类
# 第二阶段,通过Foo类创建obj对象
# Foo2 = type('Foo2', (object, ), {'func': lambda x: x + 2, 'name': 'lanxing'}) #关键字class本质是执行了type(class,base,dict=None)方法
23. exception异常的处理
23.1 引入异常
异常的写法,把子类往前放,把父类往后放。可以存在多个except分支,一个except分支执行后,其他的就不会再次执行了。
'''
异常处理:
需求:
从键盘输入被除数与除数,求商并打印结果
1,输入的数据类型问题:valueError
2,ZeroDivisionError:division by zero
try-except-finally
'''
# 这种写法太耗费程序员精力了,语法也不简洁。
# if a.isdigit() and b.isdigit():
# a1 = int(a)
# b1 = int(b)
# if b != 0:
# c = a/b
# print('商为:{0}'.format(c))
# else:
# print('ZeroDivisionError:division by zero')
# print('除数不能为0')
a = input('请输入被除数:》》》')
b = input('请输入除数:》》》')
try:
a1 = int(a)
b1 = int(b)
c = a/b
print('mod = {0}'.format(c))
# 一旦捕获到异常,try里面异常后面的语句就不会被执行了。
# 异常只会执行一次。
# 捕获异常方式用法一:
# except:
# print('输入类型有误或者除数为0')
# 捕获异常方式用法二:
# except Exception as e:#捕获异常并存储到e上
# print(type(e))
# print('输入类型有误或者除数为0')
# 捕获异常方式用法三(提倡这种写法):
# except ValueError:
# print('输入类型有误')
# except ZeroDivisionError:
# print('除数为0错误')
# except Exception:
# print('遇到异常')
# 捕获异常方式用法四,这种写法与用法三会有区别:
# except (ValueError,ValueError) as e:
# print('输入类型有误或除数为0')
# 捕获异常方式用法五:
except ValueError as e :
print(e)
except Exception:
print('遇到异常')
23.2 try-except-else-finally
'''
try:将有可能出异常的代码纳入try语句
except:捕获异常,有多种写法
else:可有可无,没有except就执行else
finally:最后执行,不管前面什么情况,都最终执行。
'''
try:
file = open('123.txt','r',encoding='utf-8')
content = file.read()
print(content)
except Exception as e:
print(e.args)
else:
print('没有异常')
finally:
file.close()
23.3 异常的传递过程
def test1():
print('---'*10+'test1开始'+'---'*10)
try:
print(aa)
except:
pass
print('---' * 10 + 'test1结束' + '---' * 10)
def test2():
print('---'*10+'test2开始'+'---'*10)
# try:
# test1()
# except:
# pass
print('---' * 10 + 'test2结束' + '---' * 10)
def test3():
print('---'*10+'test3开始'+'---'*10)
# try:
# test2()
# except:
# pass
print('---' * 10 + 'test3结束' + '---' * 10)
test3()
23.4 自定义异常
先定义一个Exception的子类,然后再在调用处使用raise语句。
'''
自定义异常:
自己创建异常类,一定要继承自Exception.
抛出异常 raise 异常对象
'''
class GenderError(Exception):
def __init__(self):
self.errMsg = '性别异常,只能设置为男或女'
class Student():
def __init__(self,name,gender):
self.name = name
self.setGender(gender)
def setGender(self,gender):
if gender in ('男','女'):
self.__gender = gender
else:
raise GenderError()
def getGender(self):
return self.__gender
stu1 = Student('刘忙','男')
try:
stu1.setGender('未知')
except Exception as e:
print(type(e))
print(e.args)
print(e.errMsg)
python day 11: 类的补充,元类,魔法方法,异常处理的更多相关文章
- python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05
反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...
- python中对象、类型和元类之间的关系
在python中对象.类型和元类构成了一个微妙的世界. 他们有在这个世界里和平共处,相辅相成.它们遵循着几条亘古不变的定律: 1.python中无处不对象 2.所有对象都有三种特性:id.类型.值 3 ...
- [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式
使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...
- Python中对象、类型、元类之间的关系
Python里的对象.类型和元类的关系很微妙也很有意思. 1989年圣诞节期间,上帝很无聊,于是创造了一个世界. 对象 在这个世界的运转有几条定律. 1.一切都是对象 对象(object)是这个世界的 ...
- python 元类与定制元类
1:元类 元类:类的创建与管理者 所有类的元类是type class a: pass print(type(a)) 结果:<class 'type'> 2:定制元类 类的实例化过程:(可看 ...
- python-元类和使用元类实现简单的ORM
元类 面向对象中,对象是类的实例,即对象是通过类创建出来的,在python中,一切皆对象,同样,类也是一个对象,叫做类对象,只是这个类对象拥有创建其子对象(实例对象)的能力.既然类是对象,那么类是通过 ...
- Python语言特性之2:元类
问题:Python中的元类(metaclasses)是什么?一般使用它干什么? 原地址:http://stackoverflow.com/questions/100003/what-is-a-meta ...
- 深刻理解Python中的元类(metaclass)以及元类实现单例模式
在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍 ...
- python面向对象(六)之元类
元类 1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: In [13]: class ObjectCreator(object): . ...
- Python元类(metaclass)以及元类实现单例模式
这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解类也是对 ...
随机推荐
- Maven的具体使用和优点
1.Apache软件基金会提供的项目自动化构建和项目管理软件. 基于项目对象模型(POM)概念,Maven利用一个中央信息片段能管理一个项目的构建.报告.文档等步骤. 官方网站:http://mave ...
- 使用RestTemplate请求报出HttpClientErrorException异常并获取不到返回body数据
描述: 使用RestTemplate请求url,由于Token等验证信息参数失效,报出 401 HttpClientErrorException异常.并且获取不到body消息体的错误信息.然而post ...
- ProxyFactoryBean与AopProxy介绍
1.ProxyFactoryBean的典型配置 2.进入getObject方法 /** * Return a proxy. Invoked when clients obtain beans from ...
- PHP系列 | Session 存储在Redis
默认是文件存储 修改php.ini的设置 session.save_handler = redis session.save_path = “tcp://127.0.0.1:6379″ 如果Redis ...
- 002-maven开发Java脚手架archrtype【如无定制开发,请直接看3.3使用】
一.概述 项目基础构建需要:项目结构,spring框架,orm,连接池,数据库,单元测试等等. 上述即使复用:001-脚手架发展,基础代码结构+mybatis代码生成,基础代码结构,也需要修改成自己单 ...
- FreeSWITCH命令大全
FreeSWITCH启动.查看.及关闭 FreeSWITCH一般安装在路径 /usr/local/freeswitch ,可执行程序位于/usr/local/freeswitch/bin 下,配置文件 ...
- sudo passwd root:没有相关指令
在linux里如果想要修改密码,就输入这个指令,但是会出现没找到这个指令,是因为环境变量里没有passwd. 解决:查找passwd的位置,sudo find / -name passwd 然后进入p ...
- Qt编写气体安全管理系统29-跨平台
一.前言 Qt的跨平台特性是非常厉害的,本来作为C++来说,跨平台的特性比JAVA还要好,只不过学习难度更大,所以大家更理解的跨平台是JAVA,Qt的跨平台特性是我见过的所有开发环境和语言中最厉害的, ...
- matlab学习笔记4--导入和导出Internet数据
一起来学matlab-matlab学习笔记4 数据导入和导出_4 导入和导出Internet数据 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合 ...
- node.js生成验证码及图片
示例代码: var svgCaptcha = require('svg-captcha'); var fs = require('fs'); var codeConfig = { size: 5,// ...