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/这篇博客对其进行了翻译. 一.理解类也是对 ...
随机推荐
- 关于 Javascript 学习,有哪些好的博客或者网站推荐?
知乎社区:http://www.zhihu.com/question/19651401 Mozilla开发者网络社区:https://developer.mozilla.org/zh-CN/ moze ...
- semi-join子查询优化 -- FirstMatch策略
FirstMatch执行semi-join子查询的一种策略. 类似于MySQL 5.x中如何执行in.exists子查询. 让我们以搜索拥有大城市的国家为例: select * from Countr ...
- Spring cloud微服务安全实战-7-6自定义metrics监控指标(1)
自己写代码来定义一个metrics,然后让prmetheus收走,在grafana里面定义一个panel并展示出来. prometheus的四种metrics指标.虽然所有的metrics都是数字,但 ...
- Clang的线程安全分析静态工具
本文内容来自 Thread Safety Analysis,如需完整学习,请参考相关链接. Clang线程安全分析工具是C++语言的一种扩展,用于警告代码中潜在的竞争条件.它在编译期间进行静态分析,无 ...
- 使用C++调用并部署pytorch模型
1.背景(Background) 上图显示了目前深度学习模型在生产环境中的方法,本文仅探讨如何部署pytorch模型! 至于为什么要用C++调用pytorch模型,其目的在于:使用C++及多线程可以加 ...
- springboot入门简单,深入难
18年1月份的时候在腾讯课堂学习springboot.springcloud搭建微服务,老师告诉我们,springboot入门容易,深入难. 因为你必须东西SpringMVC.Spring.Mybat ...
- [LeetCode] 853. Car Fleet 车队
N cars are going to the same destination along a one lane road. The destination is target miles awa ...
- node版本切换工具n的使用介绍
全局安装 npm install -g n mac的安装目录/usr/local/n/versions/node/13.2.0 因此首先在/usr/local/创建目录n,修改权限为普通访问权限,这样 ...
- Navicat工具链接 mysql"Access denied for user'root'@'IP'" 用户远程赋值
如题 用Navicat远程连接数据库出现错误 给用户添加权限 连接MySQL mysql -uroot -p: use mysql; 更改权限 使用grant all privileges on来 ...
- 配置tomcat 加载指定的jar
# vi bin/catalina.sh