python自动化之路-day7
来源:互联网 发布:阿里云售后自助服务 编辑:程序博客网 时间:2024/06/05 09:23
1.反射
2.异常处理
3.动态导入模块
4.抽象类
5.网络编程socket
6.静态,动态创建类案例
1.反射
通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法
getattr(object, name, default=None)
def getattr(object, name, default=None): # known special case of getattr """ getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case. """ pass
hasattr(object,name)
判断object中有没有一个name字符串对应的方法或属性
setattr(x, y, v)
def setattr(x, y, v): # real signature unknown; restored from __doc__ """ Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v''
delattr(x, y)
def delattr(x, y): # real signature unknown; restored from __doc__ """ Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y'' """
反射代码案例
class Foo(object): def __init__(self): self.name = "zongyimin" def func(self): return "func" obj = Foo() # #### 检查是否含有成员 ####hasattr(obj, 'name')hasattr(obj, 'func') # #### 获取成员 ####getattr(obj, 'name')getattr(obj, 'func') # #### 设置成员 ####setattr(obj, 'age', 18)setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 ####delattr(obj, 'name')delattr(obj, 'func')
2.动态导入模块
import
importlib
__import__
(
'import_lib.metaclass'
)
#这是解释器自己内部用的
#importlib.import_module('import_lib.metaclass') #与上面这句效果一样,官方建议用这个
3.异常处理
#_*_coding:utf-8_*_
"""异常处理:在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是一个提示的页面,通俗来讲就是不让用户看见大黄页!"""import sysimport os# while True:# num1 = input(">>:")# num2 = input(">>:")# try:# num1 = int(num1)# num2 = int(num2)# result = num1+num2# except Exception as e:# print(e)# print("错误")"""异常种类:AttributeError 试图访问一个对象没有的属性IOError 输入、输出异常,基本上无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误,缩进问题IndexError 索引错误KeyError 试图访问字典里不存在的键KeyboardInterrupt ctrl+c被按下NameError 使用一个还未被赋值的对象变量SyntaxError Python 代码非法TypeError 类型错误UnboundLocalError 试图访问一个未被赋值的局部变量ValueError 传入一个调用者不期望的值"""dic = ["zongyimin"]try: dic[10]except IndexError as e: print(e)dic = {"key":"value"}try: dic["key1"]except KeyError as e: print(e)s1 = "hello"try: int(s1)except Exception as e: print(e)try: #主代码块 passexcept KeyError as e: #异常时,执行该模块 passelse: #主代码模块执行完,执行该模块 passfinally: #无论异常与否,最终执行该模块 pass"""主动触发异常"""try: raise Exception("错误")except Exception as e: print(e)"""自定义异常"""class zongyiminException(Exception): def __init__(self,msg): self.message = msg def __str__(self): #如何一个类中定义了__str__方法,那么打印对象时,默认输出该方法的返回值 return self.messagetry: raise zongyiminException("自定义异常")except zongyiminException as e: print(e)"""断言"""# assert 条件assert 1==1try: assert 1==2except AssertionError as e: print(e)
"""断言"""
# assert 条件
assert 1==1
try: assert 1==2
except AssertionError as e:
print(e)
4.网络编程
服务端:
import socketserver =socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.bind(("0.0.0.0",8000))server.listen(5)print("listen is ready")while True: conn,client_addr = server.accept() #阻塞直到有客户端连接 print(conn,client_addr) while True: try: data = conn.recv(1024) print("+",data) conn.send(b"get your msg") except ConnectionResetError as e: print(e) break
客户端:
import socketclient = socket.socket()client.connect(("localhost",8000))while True: msg = input(">>").strip() if len(msg) == 0 :continue client.send(msg.encode()) data = client.recv(1024) print(data)
5.抽象类案例
# -*- coding:utf-8 -*-"""抽象类案例"""class Alert (object): #父类定义send函数,继承它的子类必须重新定义方法 """报警基类""" def send(self): # pass raise NotImplementedError # def send(self): # exit("没有定义方法")class MailAlter(Alert): def send(self,msg): #子类中必须定义方法 print("sdasdasda",msg) pass # passclass SendAlter(Alert): passm = MailAlter()m.send("name")
6.动态创建类案例
"""静态创建类"""class Foo(object): def __init__(self,name): self.name = namef = Foo("zongyimin")print(type(f))print(type(Foo))
#使用云类type()动态创建类def func(self): print("helllo word")Foo = type("Foo",(object,),{"func":func}) #动态创建类print(Foo)print(type(type))
要创建一个class对象,
type()
函数依次传入3个参数:
- class的名称;
- 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
- class的方法名称与函数绑定,这里我们把函数
fn
绑定到方法名hello
上。通过
type()
函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()
函数创建出class。正常情况下,我们都用
class Xxx...
来定义类,但是,type()
函数也允许我们动态创建出类来,也就是说,动态语言本身支持运行期动态创建类,这和静态语言有非常大的不同,要在静态语言运行期创建类,必须构造源代码字符串再调用编译器,或者借助一些工具生成字节码实现,本质上都是动态编译,会非常复杂。
0 0
- python自动化之路-day7
- python+selenium自动化测试之路Day7之Xpath定位详解
- Day7、Python
- Python-day7
- C++学习之路 day7
- python自动化之路-day1
- python自动化之路-day2
- python自动化之路-day3
- python自动化之路-day4
- python自动化之路-day5
- python自动化之路-day6
- python自动化之路-day8
- python自动化之路-day9
- python自动化之路-day10
- python自动化之路-day12
- python自动化之路-day13
- python自动化之路-day13
- python自动化之路-day14
- red hat6.5更新yum源
- objc_setAssociatedObject 关联的使用
- Hibernate问题总结一
- 自己总结的nginx.conf
- mybatis mapper.xmlj讲解
- python自动化之路-day7
- Jenkins使用场景
- spring-security学习
- java注解式开发基础
- 【交易日记】2016-11-28
- 【机器视觉】【百度】突然想到程序要工作这个市场
- 线段树扫描线模板
- MYsql备份数据库如何导入到新数据库!
- unity中出现UriFormatException: URI scheme must start with a letter and must consist of one of alphabet,