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

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

 

 

 

 

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