面向对象多继承,网络编程,编写网络相关程序

2018-09-05 07:57:41来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一丶面向对象多继承

1.先找左边再找右边

class A(object):
    pass


class B(object):
    def f1(self):
        print('B')


class C(A,B):
    pass

obj = C()

obj.f1()
多继承

2.经典类和新式类

经典类:

  新式类如果自己或者自己的前辈只要有人继承object,那么此类就是新式类

新式类:

  经典类和新式类的查找成员的顺序不一样

    经典类,一条路走到黑(深度优先)

    新式类,c3算法实现(python2.3时更新c3算法)

class A(object):
    pass

class B(A):
    pass

class C(B):
    pass

class D(object):
    pass

class E(D,C):
    pass

class F(object):
    pass

class G(F):
    pass

class H(C,G):
    pass

class Foo(E,H):
    pass


# print(E.__mro__)
# print(H.__mro__)
"""
L(Foo + L(E)  + L(H) )



L(E) = E,D,C,B,A,object
L(H) = H,C,B,A,G,F,object

Foo = (object) + (G,F,object)
Foo,E,D,H,C,B,A,G,F,object
"""
print(Foo.__mro__)
c3算法
Foo + (C,D,F,G) + (G,D,G,W) + (I,G,D,G,W) 

Foo, I,B

注意事项:super 是遵循__mro__执行顺序
  获取第一个表头,和其它表位进行比较
    不存在则拿走
    如果存在,则放弃,然后获取第二个表的表头再次和其他表的表尾进行比较.


在python 3.x中取消了经典类,默认都是新式类,并且不必显式的集成object
也就是说
class Person(object):pass
class Person():pass
class Person:pass
三种写法并无区别,推荐第一种
但是在python 2.x中,默认都是经典类,只有显式继承了object才是新式类,
即:
class Person(object):pass 新式类写法
class Person():pass 经典类写法
class Person:pass 经典类写法

 

作者:王猫猫
链接:https://www.zhihu.com/question/19698598/answer/12704353
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')但是 python2.6+ 可以使用 from __future__ import print_function 来实现相同功能> 
 2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 class Foobar(object): pass 显式地子类化object但是最好还是加上. 主要区别在于 old-style 是 classtype 类型而 new-style 是 type类型>  
3. 原来1/2(两个整数相除)结果是0,现在是0.5了python 2.2+ 以上都可以使用 from __future__ import division 实现改特性, 同时注意 // 取代了之前的 / 运算>  
4. 新的字符串格式化方法format取代%错误, 从 python2.6+ 开始已经在str和unicode中有该方法, 同时 python3依然支持 % 算符> 
5. xrange重命名为range同时更改的还有一系列内置函数及方法, 都返回迭代器对象, 而不是列表或者 元组, 比如 filter, map, dict.items 等>  
6. !=取代  <   >  python2 也很少有人用  <  >  所以不算什么修改> 
7. long重命名为int不完全对, python3 彻底废弃了 long+int 双整数实现的方法, 统一为 int , 支持高精度整数运算.>
8. except Exception, e变成except (Exception) as e只有 python2.5 及以下版本不支持该语法. python2.6 是支持的. 不算新东西>  10. exec变成函数类似 print() 的变化, 之前是语句.
python2.x 和 python 3.x的部分区别

 

二丶 网络编程

1.软件

  客户端:cs架构,client  -> server

  浏览器:Bs架构 browser ->server

2.如何实现相互通信

 需求一: 编写两个软件(软件之间互相通信)

 需求二:两个人直接连接

 需求三:局域网互联

3.基于socket模块实现网络通信

  为什么要向网络通信发送的是字节,而不是字符串?

   py.3 send/recv 都是字节

   py.2send/recv都是字符串

服务器端:

   accept 阻塞:等待客户端连接.  

   recv 阻塞:等待服务器发来数据

客户端:

   connect 阻塞一直在连接,直到连接成功才往下运行其他代码

   recv, 阻塞:等待服务器发来的数据

import socket

server = socket.socket()

server.bind(('192.168.13.155',8001))

server.listen(5)

while True:
    conn,addr = server.accept()
    # 字节类型
    while True:
        data = conn.recv(1024) # 阻塞
        if data == b'exit':
            break
        response = data + b' SB'
        conn.send(response)

    conn.close()
服务器端
# by luffycity.com

import socket

client = socket.socket()

# 王晓东向服务端发起连接请求(递伞)
# 阻塞,去连接,直到连接成功后才会继续向下走。
client.connect(('192.168.13.155',8000))


# # 链接上服务端后,向服务端发送消息
client.send(b'hello')


# 王晓东等待服务端给他发送消息
data = client.recv(1024)
print(data)

# 关闭自己
client.close()
客户端一
# by luffycity.com


import socket

sk = socket.socket()

sk.connect(('192.168.13.155',8001))

while True:
    name = input("请输入姓名:")
    sk.send(name.encode('utf-8')) # 字节
    if name == 'exit':
        break

    response = sk.recv(1024) # 字节
    print(response.decode('utf-8'))

sk.close()
客户端二

 

 

 

 

 

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Python基础语法

下一篇:第一天 Python基础的学习