第三模块 面向对象& 网络编程基础 实战考核
1、简述构造方法和析构方法。
构造方法(__init__):主要作用是实例化时给实例一些初始化参数,或执行一些其它的初始化工作,总之因为这个__init__只要一实例化,
就会自动执行,不管你在这个方法里写什么,它都会统统在实例化时执行一遍。
__del__就是析构方法。
实例在内存中被删除时,会自动执行这个方法,如你在内存里生成了一个人的实例,现在他被打死了,那这个人除了自己的实例要被删除外,
可能它在实例外产生的一些痕迹也要清除掉,清除的动作就可以写在这个方法里。
2、口述一下在python3.6环境下的结果。口述一下在python2.7环境下的结果。
在python3.6下执行的结果 : from D
[A E B C object]
在python2.7下执行的结果:from D
然后抛出异常 ,经典类没有mro属性
3、 静态方法和类方法的区别是什么?
静态方法:staticmethod ,对象和类都可以调用,没有自动传值一说。
类方法:classmethod, 类调用时会交类本身当作第一个参数传入。对象调用时也会交类本身当作第一个参数传入。
4、简述__new__和__init__的区别
答:1、__new__是一个静态方法。类实例化时第一个执行,执行完后才执行__init__,继承自object的新式类才有__new__
2、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
3、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类
(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例
4、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
5、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是cls来保证是当前类实例,如果是其他类的类名,
;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。
包:数据粘在一起,主要因为:接收方不知道消息之间的界限,不知道一次性提取
多少字节的数据造成的数据量比较小,时间间隔比较短,就合并成了一个包
class Student: __count = 0 def __init__(self,name): self.name = name Student.__count += 1 def eat(self): print("%s is eating"%self.name) def tell_info(self): print("一共实例化了%s 个学生"%Student.__count) s1 = Student("alex") s2 = Student("andyzhnag") s3 = Student("fengfeng") s2.tell_info()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket import subprocess import struct server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(("127.0.0.1",8080)) server.listen(5) while True:#链接循环 print("start...") conn,addr=server.accept() print(addr) while True:#通信循环 cmd = conn.recv(1024) res = subprocess.Popen(cmd.decode("utf-8"),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) stdout = res.stdout.read() stderr = res.stderr.read() conn.send(stdout) conn.send(stderr) conn.close() server.close()
客户端
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) ip_port = ("127.0.0.1",8080) print("start...") client.connect(ip_port) while True: cmd = input("请输入命令:") client.send(cmd.encode("utf-8")) msg = client.recv(8096) print(msg.decode("gbk"))
1. 初始化时传递一个标志位,标志位默认为None,不为None时,可以使用clear()方法清空列表中的元素。
2.添加元素时,只能添加字符串,其余类型则报错。
3. 实现获取中间值的属性。
class List(list):
def __init__(self,char,tag = None):
for i in char:
if not isinstance(i,str):
raise TypeError("传入的值必须为字str")
else:
super().__init__(char)
self.tag = tag
def clear(self):
if self.tag:
super().clear()
else:
print("标志位不允许删除")
def mid(self):
half_mid = len(self) //2
return self[half_mid]
l = List(["alex","egon","fengfeng","andyzhang"])
print(l)
print(l.mid())
l.clear()
l.tag = True
l.clear()
print(l)