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

今日概要:

  一、面向对象进阶

    1、isinstance(obj,cls)和issubclass(sub,super)

    2、__setattr__,__getattr__,__delattr__

    3、二次加工标准类型(包装/授权)

    4、__setitem__,__getitem__,__delitem__

    5、__str__,__repr__,__format

    6、__next__,__iter__实现迭代器协议

    7、__doc__

    8、__del__析构函数

    9、__enter__,__exit__

    10、__call__

    11、metaclass 元类

  二、网络编程

    1、osi七层

    2、socket是什么

    3、套接字的工作流程

    4、基于tcp的套接字

    5、基于udp的套接字

    6、recv和recvfrom的区别

    7、粘包现象

    8、socketserver解决并发

一、isinstance和issubclass

  isinstance(obj,cls)检查是否obj是否是类 cls 的对象

例子:  

class Foo(object):
     pass

obj = Foo()

isinstance(obj, Foo)

  

  issubclass(sub, super)检查sub类是否是 super 类的派生类 

例子:

class Foo:
    pass

class Go(Foo):
    pass

print(issubclass(Go,Foo))

‘‘‘
输出
True

‘‘‘  

二、__setattr__,__getattr__,__delattr__

#!/usr/bin/python
# -*- coding:utf-8 -*-

#特殊getattr 为 必须类的属性不存在 才执行
class Foo:

    def __init__(self,x):
        self.x = x

    def __setattr__(self, key, value):
        self.__dict__[key] = value   #正确都使用方法
        #setattr(self,key,value) #进入无限递归

    def __getattr__(self, item):
        print (‘getatt‘)

    def __delattr__(self, item):
        #del self.item  进入无限递归
        self.__dict__.pop(item)

#__setattr__修改或者添加属性才会执行
g = Foo(10)

print (g.x)

print(g.__dict__)  #setattr重写了,如果__setattr__什么都没写,除非直接操作属性字典,否则永远无法赋值

#__delattr__删除属性才会触发

g.__dict__[‘y‘] = 2  #可以用这种方式直接修改属性字典,完成添加或修改属性的操作

print (g.__dict__)

g.xxxxxx   #使用.调用属性,但属性不存在但时候,才触发

‘‘‘
输出:
    10
    {‘x‘: 10}
    {‘x‘: 10, ‘y‘: 2}
    getatt
‘‘‘

attr示例

代码示例

三、二次加工标准类型(包装/授权)

  包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工

#继承list类的所有属性,可派生出自己新的比如append和mid方法
class List(list):

    def __init__(self,item,tag=False):
        super().__init__(item)
        self.tag = tag

    def append(self, p_object):
        print (‘派生都自己都属性+类型检查‘)
        if not isinstance(p_object,str):
            raise TypeError(‘%s must be str‘ %(p_object))

    def mid(self):
        print(‘自定义属性‘)
        mid_index=len(self) // 2
        return self[mid_index]

    def clear(self):

        if not self.tag :
            raise PermissionError(‘%s permission ‘)
        else:
            super().clear()
            self.tag = False

l = List([1,2,3])

print (l)

l.append(‘4‘)
print (l)
# l.tag = True
# l.clear()

二次加工标准类型基于继承实现

  授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

  实现授权的关键点就是覆盖__getattr__方法

#!/usr/bin/python
# -*- coding:utf-8 -*-
import time

class Filehandle:
    def __init__(self,filename,mode=‘r‘,encoding=‘utf-8‘):
        self.file = open(filename,mode=mode,encoding=encoding)

    def write(self,line):
        t = time.strftime(‘%Y-%m-%d %X‘)
        self.file.write(‘%s %s‘ %(t,line))

    def __getattr__(self, item):
        return getattr(self.file,item)

f1 = Filehandle(‘b.txt‘,‘w+‘,encoding=‘utf-8‘)

f1.write(‘123123‘)

#如下方法为非重写方法通过__getattr和反射 去原来的方法里查找
f1.seek(0)
print (f1.read())
f1.close()

授权例子1

时间: 2024-11-28 19:22:00

python自动化开发-[第八天]-面向对象高级篇与网络编程的相关文章

python自动化开发学习-8 面向对象进阶

---恢复内容开始--- 类的成员(字段,方法,属性) 注意:所有成员中,只有普通字段的内容是保存在对象中.而其他成员都是保存在类中,即无论创建多少个对象,在内存中只保留一份. 1.字段 字段包含:普通字段和静态字段,在使用中有所区别,最本质的区别是内存中保存的位置不同. 普通字段:属于对象 静态字段:属于类, 多个对象共用一个字段,主要用于对象的变量内容都一样的情景. 注意: 静态字段在代码加载的时候就被创建了,而普通字段在类被实例化的时候才会被创建.# 示例代码: class Provinc

老男孩教育Python自动化开发精英班-开班典礼感想

2016年1月14日   老男孩教育Python自动化开发精英班-第一天 期待中的老男孩教育Python自动化开发精英班开办了. 我知道对于我这个年龄进入这个班意味着什么?首先,精力不如年轻人,其次,单位繁杂的事务性工作较多.所以,从现在起必须对工作处理更加效率,休息时间要进行压缩,否则就不能腾出更多的时间学习,压力还是很大的. 我知道,在这个班中都是些年轻人,大家都为了掌握一门具备前瞻性.实用性和就业面宽广的本事而来,以后可以在社会上有更多的.更好的和收入可观的发展机会.有人问了,你都快退休了

面向对象(高级篇之抽象类与接口的应用)

抽象类的实际应用-----模板设计 接口的实际应用--------制定标准 设计模式-------工厂设计 程序在接口和子类之间加入了一个过渡端,通过此过渡端取得接口的实例化对象. 设计模式-------代理设计 所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理. 相当于我玩一个游戏需要登录游戏,在这个登录的时候可以设计两个类,一个是登录,另一个是检验你的用户名与密码,而登录是附着在检验类上的. 设计模式-------适配器设计 对于

第13篇-JAVA 网络编程

第13篇-JAVA 网络编程 每篇一句 比我强大的人都在努力我还有什么理由不拼命 初学心得 不去追逐你所渴求你将永远不会拥有 (笔者JEEP/711)[JAVA笔记 | 时间:2017-04-22| JAVA 网络编程 ] 1.网络编程基本概念 1.什么是计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备通过通信线路连接起来在网络操作系统网络管理软件及网络通讯协议的管理和协调下实现资源共享和信息传递的计算机系统 把分布在不同地理区域的计算机与专门的外部设备用通讯线路互

Java基础篇Socket网络编程中的应用实例

说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法. 要求:客户端通过Socket通信技术上传本地一

Python自动化开发课堂笔记【Day08】 - Python进阶(面向对象的高级用法,网络编程)

面向对象的高级用法 1. __str__ 只要执行打印对象的操作,就会触发该对象类中的__str__方法(也就是对象的绑定方法)它是一种默认的方法,默认的打印输出为<__main__.Foo object at 0x003EE350>,但是如果将该绑定方法在类中重写的话,要求必须有以字符串类型的返回值,返回形式可以自己设定. class Foo: def __init__(self,name,age): self.name = name self.age = age def __str__(s

python自动化开发学习【第七天】

面向对象简介 a.面向过程:根据业务逻辑从上到下编写代码. b.函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可. c.面向对象:对函数进行分类和封装. 注:java和C# 都只支持面向对象编程,python比较灵活即支持面向对象也支持函数式编程. 创建类和对象 面向对象编程时一种编程方式,通过使用“类”与“对象”来实现,所以面向对象其实就对“类”与“对象”的使用. a.类就是一个模板,模板可以包含多个函数,函数里实现一些功能. b.对象则是根据模板创建的实例,通过实例对

Python自动化开发

第一篇:Python入门基础 第二篇:python数据类型 第三篇:函数编程 第四篇:生成器.迭代器.装饰器 第五篇:常用模块 第六篇:面相对象 第七篇:面相对象进级 第八篇:socket网络编程 第九篇:进程与线程 第十篇:异步IO.消息队列 第十一篇:消息队列.缓存 第十二篇:数据库操作 第十三篇:HTML和CSS入门 第十四篇:JavaScript基础 第十五篇:JavaScript 之 Dom操作 第十六篇:jQuery基础 第十七篇:Django入门 第十八篇:Django进级 第二十

python全栈开发基础【第十八篇】网络编程(socket)

一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系:我们用socket就是为了完成C/S架构的开发 osi七层 引子: 须知一个完整的计算机系统是由硬件.操作系统.应用软件三者组成,具备了这三个条件,一台计算机系统就可以自己跟自己玩了(打个单机游戏,玩个扫雷啥的) 如果你要跟别人一起玩,那你就需要上网了,什么是互联网? 互联网的核心就是由一堆协议组成