知识点概览:

  • 静态方法,类方法,属性方法
  • 类的特殊方法
  • 反射
  • 异常处理
  • socket开发基础

一、静态方法:@staticmethod

       只是名义上归类管理,实际上在静态方法里访问不了类或者实例中的任何属性。也可以说跟类没什么关系了,也就是截断了跟类的关联,实际上也就是一个函数而已。

         实际场景就可以用它来做个工具包

#!/usr/bin/env python
# -*- coding:utf-8 -*- class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
# def eat(self,food):
# print("%s is eating %s"%(self.name,food))
def eat(self):
print("%s is eating %s"%(self.name,'试试')) d = Dog("hehe")
#d.eat() #原始调用可以执行
d.eat(d) #调用静态方法

二、类方法:只能访问类变量,不能访问实例变量

         就比如说是修改国籍一样,不让改国籍,所以就直接创建一个写死的类变量,再怎么实例化也改不了

#!/usr/bin/env python
# -*- coding:utf-8 -*- class Dog(object):
name = 123 #定义类变量
def __init__(self,name):
self.name = name @classmethod #类方法
def eat(self):
print("%s is eating %s"%(self.name,'sss')) def talk(self):
print("%s is talking..."%self.name) d = Dog("hehe")
d.eat()

三、属性方法:就是把一个方法变成静态属性

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None #实例化一个私有属性
@property #先把一个方法变成一个属性,然后修改。。
def eat(self):
print("%s is eating %s"%(self.name,self.__food))
@eat.setter #实例化的时候赋值
def eat(self,food):
self.__food = food
print("set to food ",food)
@eat.deleter #实现对属性方法的删除操作
def eat(self):
del self.__food
print("删完了私有属性food")
def talk(self):
print("%s is talking"%self.name) d = Dog("hihi")
#d.eat() #不能够被调用
d.eat #如果要传参数的话那就比较尴尬了,因为不能调用啊。需要setter来辅助实现
d.eat = "呵呵哒" #辅助实现参数传 递
#del d.name #删除实例变量
#print(d.name) #打印参数
d.eat
del d.eat #默认的话不能删除属性方法,如果要实现的话需要在setter中删除

  使用场景:比如说三方软件对航空公司的接口调用,实现查询结果的进一步解析,提取出所需的信息,然后再通过可视化的方式传递给用户

#!/usr/bin/env python
# -*- coding:utf-8 -*- class Flight(object): #定义一个航班类
def __init__(self,name): #初始化(实例化)参数
self.name = name #实例化参数的传递 def check_status(self): #航空公司状态定义
print("checking flight %s status "%self.name)
return 2
@property #属性方法的调用
def flight_status(self): #对航空公司给的数据加以处理
status = self.check_status()
if status == 0:
print("flight canceled!!!")
elif status == 1:
print("flight already alive!!")
elif status == 2:
print("flight is comming!!")
else:
print("unrecognised status!!!") @flight_status.setter #状态属性的修改装饰器
def flight_status(self,status):
print("flight %s has changed status to %s"%(self.name,status)) f = Flight("ACC123") #定义要查的航线
f.flight_status #调用航空状态
f.flight_status = 0 #实现对状态的修改

四、类的特殊方法

  • 类的两种表示方式:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#类的普通方式
class Foo(object):
def __init__(self,name):
self.name = name f = Foo("jack")
print(type(f)) #f之后的类是Foo
print(type(Foo)) #Foo之后的类是type #类的装逼方式
def func(self): #self是为了了之后装配到类中
print("hello world!!") Foo = type('Foo',(),{'funcs':func}) #定义一个Foo的对象,其实也就是类
print(type(Foo))
f = Foo() #实例化Foo
f.funcs() #调用类的方法

  得出的结论是:类来源于type

呵呵:这就是生命的起源

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def func(self): #类里面的方法
print("hello world!!%s"%self.name) def __init__(self,name,age): #初始化参数
self.name = name
self.age = age Foo = type('Foo',(object,),{'funcs':func,'__init__':__init__}) #定义类 f = Foo("nimei",23) #实例化
f.funcs() #方法调用

  

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Mytype(object):
def __init__(self,what,bases=None,dict=None):
print("--mytype init--")
super(Mytype, self).__init__(what,bases,dict)
def __call__(self, *args, **kwargs):
print("--Mytype call--")
class Foo(object):
__metaclass__ = Mytype def __init__(self,name):
self.name = name
print("Foo --init__") def __new__(cls,*args,**kwargs):
print("Foo --new--")
return object.__new__(cls) #new是自带的方法
18

五、反射

    通过字符串映射或者修改程序运行时的状态,属性,方法  

  • hasattr(obj,name_str):判断一个对象obj里是否有对应的字符串name_str的方法映射
  • getattr(obj,name_str):根据字符串去获取obj对象里对应方法的内存地址
  • setattr(obj,name_str,z):通过字符串z,设置新的属性
  • delattr(obj,name_str):根据name_str删除obj一个属性
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
def bulk(self): #添加新的属性需要单独在类外面定义一个方法
print("%s is bulking..."%self.name) class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating"%self.name,food) d = Dog("hehe")
choice = input("输入>>:").strip() if hasattr(d,choice): #判断一个对象d里是否有对应的字符串choice的方法映射
func = getattr(d,choice) #根据字符串去获取d对象里对应方法的内存地址
# func("呵呵") #根据方法传入类里面定义的参数
setattr(d,choice,"cccc") # 修改传入的参数
delattr(d,choice) #删除传入的参数
else:
# setattr(d,choice,bulk)
# d.talk(d) #方法调用
setattr(d,choice,1234) #添加新属性1234
print(getattr(d,choice))
print(d.name) #打印类里面的参数对应的值(上面if语句中的setattr里的cccc)

六、异常处理

      作用是:虽然程序出错了,但是不想让用户看到这个报错

格式:
try:
code #执行代码
except (Error1,Error2) as e: #两个错误定义
print(e) #打印错误,也可定义处理方式
#多种异常
except Exception as w: #多个错误定义(一般建议最后在用,定义未知错误)
print(w) #打印错误,也可定义处理方式

 例子:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui names = ['memeda','mengmengda','heheda']
data = {}
#names[4] #异常:IndexError: list index out of range
#data['name'] #KeyError: 'name'
#两种错误的处理
try:
names[4] #尝试执行names[4]
data['name']
open("hehehhe")
# except IndexError as e: #如果有IndexError报错的话执行下面的操作
# print('没有你要找的key:',e)
# except KeyError as e:
# print("字典的key不存在",e)
#或者将上述的两个except组合
except (KeyError,IndexError) as e: #组合:只能抓到第一个错
print("只能抓到第一个错%e",e) #多种错误的处理( 一般最后位置用):抓住所有的错误
except Exception as e:
print("未知错误%s",e)
else:
print("一切正常!!")
finally:
print("不管有没有错都执行!!")

 常见的异常类型:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
常用异常

 自定义异常

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:wanghui
class TmpError(Exception): #自定义异常类
def __init__(self,msg):
self.msg = msg
def __str__(self): #类的格式返回函数
return self.msg
try:
raise TmpError('自定义异常!!') #触发异常
except TmpError as e:
print('自定义的错误%s',e)

七、socket网络基础:

Python 提供了两个基本的 socket 模块。

第一个是 Socket,它提供了标准的 BSD Sockets API。

第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

下面讲的是Socket模块功能

1、Socket 类型

套接字格式:

socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。

socket类型

描述

socket.AF_UNIX

只能够用于单一的Unix系统进程间通信

socket.AF_INET

服务器之间网络通信

socket.AF_INET6

IPv6

socket.SOCK_STREAM

流式socket , for TCP

socket.SOCK_DGRAM

数据报式socket , for UDP

socket.SOCK_RAW

原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

socket.SOCK_SEQPACKET

可靠的连续数据包服务

创建TCP Socket:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

创建UDP Socket:

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2、Socket 函数

注意点:

1)TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。

2)服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。

socket函数

描述

服务端socket函数

s.bind(address)

将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.

s.listen(backlog)

开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。

s.accept()

接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

客户端socket函数

s.connect(address)

连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

s.connect_ex(adddress)

功能与connect(address)相同,但是成功返回0,失败返回errno的值。

公共socket函数

s.recv(bufsize[,flag])

接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。

s.send(string[,flag])

发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。

s.sendall(string[,flag])

完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

s.recvfrom(bufsize[.flag])

接受UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

s.sendto(string[,flag],address)

发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。

s.close()

关闭套接字。

s.getpeername()

返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。

s.getsockname()

返回套接字自己的地址。通常是一个元组(ipaddr,port)

s.setsockopt(level,optname,value)

设置给定套接字选项的值。

s.getsockopt(level,optname[.buflen])

返回套接字选项的值。

s.settimeout(timeout)

设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())

s.gettimeout()

返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。

s.fileno()

返回套接字的文件描述符。

s.setblocking(flag)

如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。

s.makefile()

创建一个与该套接字相关连的文件

3、socket编程思路

TCP服务端:

1 创建套接字,绑定套接字到本地IP与端口

# socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()

2 开始监听连接                   #s.listen()

3 进入循环,不断接受客户端的连接请求              #s.accept()

4 然后接收传来的数据,并发送给对方数据         #s.recv() , s.sendall()

5 传输完毕后,关闭套接字                     #s.close()

TCP客户端:

1 创建套接字,连接远端地址

# socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.connect()

2 连接后发送数据和接收数据          # s.sendall(), s.recv()

3 传输完毕后,关闭套接字          #s.close()

 

【python自动化第七篇:面向对象进阶】的更多相关文章

  1. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  2. 【python自动化第十一篇】

    [python自动化第十一篇:] 课程简介 gevent协程 select/poll/epoll/异步IO/事件驱动 RabbitMQ队列 上节课回顾 进程: 进程的诞生时为了处理多任务,资源的隔离, ...

  3. python自动化开发-[第八天]-面向对象高级篇与网络编程

    今日概要: 一.面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) 2.__setattr__,__getattr__,__delattr__ 3.二 ...

  4. [资料分享]Python视频教程(基础篇、进阶篇、项目篇)

    Python是一种开放源代码的脚本编程语言,这种脚本语言特别强调开发速度和代码的清晰程度.它可以用来开发各种程序,从简单的脚本任务到复杂的.面向对象的应用程序都有大显身手的地方.Python还被当作一 ...

  5. RobotFramework + Python 自动化入门 四 (Web进阶)

    在<RobotFramwork + Python 自动化入门 一>中,完成了一个Robot环境搭建及测试脚本的创建和执行. 在<RobotFramwork + Python 自动化入 ...

  6. python自动化运维篇

    1-1 Python运维-课程简介及基础 1-2 Python运维-自动化运维脚本编写 2-1 Python自动化运维-Ansible教程-Ansible介绍 2-2 Python自动化运维-Ansi ...

  7. 图解Python 【第七篇】:网络编程Socket

    本节内容一览图:  前言总结: Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它 ...

  8. Python【第七篇】面向对象进阶

    大纲 一.面向对象高级语法 1.静态方法.类方法.属性方法 2.类的特殊成员方法 3.反射 二.异常处理 三.网络编程之socket基础 一.面向对象高级语法 1.静态方法:名义上归类管理,实际上静态 ...

  9. python基础-第七篇-7.2面向对象(进阶篇)

    进入到今天的探索前,我先对上节内容进行一下回顾: 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用 类是一个模板,模板中包装了多个函数可供使用 对象是基于类创建的,实例用于调用被包装在类 ...

随机推荐

  1. HTML5学习笔记----html5与传统html区别

    一. HTML5语法的改变 该知识点所说变化指的是基于HTML4基础上所定义的改变,主要有如下: HTML5的文件扩展符(.html或.htm)与内容类型(text/html)保持不变. HTML5中 ...

  2. Linux-Tcp-IP

    /* tcpcli.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...

  3. IT新人养成与蘑菇理论

    (一)来源及定义    “蘑菇定律”最早是在上世纪70年代一批年轻的电脑程序员编写的.当时,美国一批电脑程序员意外发现,一批刚从学校毕业的新人参加了工作,这些人很难适应工作环境.在这种情况下,这些电脑 ...

  4. 自由树的计数 Labeled unrooted tree counting

    问题: 4个标记为1,2,3,4的节点构成自由树(算法导论里的定义,连接着,无环,无向的图),一共有多少种构造方法?如果N个节点呢? 解决方法: 4个节点可以通过穷举的方式得到答案,一共有16中方式. ...

  5. activemq启动不起来,报错Address already in use: JVM_Bind

    之前莫名其妙的activemq怎么都启动不起来后来多方查询是因为widows 的ICS服务. 解决方案是,我的电脑上邮件,选择服务,然后在服务中找到Internet Connection Sharin ...

  6. 【转】WPF中的Binding技巧(二)

    WPF中的Binding技巧(二)     接上篇, 我们来看一看Elementname,Source,RelativeSource 三种绑定的方式 1.ElementName顾名思义就是根据Ui元素 ...

  7. android系统如何自适应屏幕大小

    1.屏幕相关概念 1.1分辨率 是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 android将屏幕大小分为四个级别 ...

  8. 【POJ 2152】 Fire (树形DP)

    Fire   Description Country Z has N cities, which are numbered from 1 to N. Cities are connected by h ...

  9. http://www.cnblogs.com/xdp-gacl/p/3951952.html

    http://www.cnblogs.com/xdp-gacl/p/3951952.html http://www.cnblogs.com/kristain/articles/2409021.html

  10. Android 使用WakeLock

           为了延长电池的使用寿命,Android设备会在一段时间后使屏幕变暗,然后关闭屏幕显示,最后停止CPU.WakeLock是一个电源管理系统服务功能,应用程序可以使用它来控制设备的电源状态. ...