- 类的静态方法及属性
多态:多态即为接口的重用(父类调用子类)
1 #!/usr/bin/env python 2 # encoding: utf-8 3 class Animal: 4 def __init__(self,name): 5 self.name = name 6 def talk(self): 7 raise NotImplementedError("Subclass must implement abstract method") 8 9 class Cat(Animal):10 def talk(self):11 return 'meow'12 class Dog(Animal):13 def talk(self):14 return 'Woof!Woof!'15 16 17 def animal_talk(obj):18 print(obj.talk())19 c = Cat("SanJiangMei")20 d = Dog("SanJiangYuan")21 animal_talk(c)22 animal_talk(d)23 24 或者:25 #animals = [Cat('Missy'),26 # Dog('Lassie')]27 #for animal in animals:28 # print(animal.name + ':' + animal.talk())
类的成员:字段(普通字段、静态字段)、方法(普通方法、类方法、静态方法)、属性 字段也就是变量的意思,普通字段即实例变量。静态字段即类变量 类的方法: 1、@classmethod :类方法,不能访问实例变量 2、@staticmethod :静态方法,不能访问类变量及实例变量 3、@property :把方法变成属性 把变量变成私有属性方法: 加入__即可 ,如果非要访问的话,那么在变量前边加上下划线及类名:_Animal__ 多继承
#!/usr/bin/env python # encoding: utf-8 class A: n = 'A' def f2(self): print("f2 from A") class B(A): n = 'B' def f1(self): print("from B") def f2(self): print("f2 from B") class C(A): n = 'C' def f2(self): print("from C") #类D同时继承B和C class D(B,C):#f2方法先找B然后找C,最后找A,这是广度优先 #广度优先的意思为先找同级别,如果同级别没有了再找上一级别 pass d = D() print(d.f1()) print(d.f2()) 类的特殊成员: 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段、方法和属性三大类成员,并且成员名前如果有两个 下划线,则表示该成员是私有成员,私有成员只能由类内部调用,无论人或事物往往都有不按套路出牌的情况,Python的 类成员也是如此,存在着一些具有特殊含义的成员,详情如下: 1、__doc__ 表示类的描述信息(打印类的注释信息、文档) 例如: class D(B,C):#f2方法先找B然后找C,最后找A,这是广度优先 #广度优先的意思为先找同级别,如果同级别没有了再找上一级别 '''Test class''' pass d = D() print(d.__doc__) 2、__module__和__class__ __module__ 表示当前操作的对象在那个模块(表示所导入的模块的所在文件的文件名) #!/usr/bin/env python # encoding: utf-8 from multi_inheritance import D a = D() print(a.__module__) __class__表示当前操作的对象的类是什么 3、__init__ 构造方法,通过类创建对象时,自动触发执行。 4、__del__ 析构方法,当对象在内存中被释放时,自动触发执行。 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作 都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的 def __del__(self):#整个程序执行完后销毁 print("deleteing the ...")
5、__call__ 对象后面加括号,触发执行 注:构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行是由对象后加括号触发的, 即:对象()或者类() 6、__new__ 此方法会重构类,类中的__init__不会被执行初始化,类中的方法也不能执行 7、__dict__ 类中的变量以字典的形式体现出来 8、__str__ 如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值。 9、__getitem__、__setitem__、__delitem__ 用于索引操作,如字典,以上分别表示获取、设置、删除数据 反射:
#!/usr/bin/env python # encoding: utf-8 import sys class Webserver(object): def __init__(self,host,port): self.host = host self.port = port def start(self): print("Server is starting...") def stop(self): print("Server is stopping...") def restart(self): self.stop() self.start() def test_run(self,name): print("running ...",name,self.host) if __name__ == '__main__': print(sys.argv[1]) server = Webserver('localhost',333) #方法二: if hasattr(server,sys.argv[1]):#判断类中是否存在这个属性,如果存在即为真 func = getattr(server,sys.argv[1])#getattr()作用是获取server.start的内存地址 func()#相当于server.start() #setattr方法: # setattr(server,'run',test_run)#把test_run定义到类中 # server.run(server,'shidong') #delete方法:只能删除自己的,不能删除类中的属性 delattr(server,'host') print(server.host) delattr(Webserver,'start') print(server.restart()) #方法一: # cmd_dic = { # 'start':server.start, # 'stop':server.stop # } # if sys.argv[1] in cmd_dic: # cmd_dic[sys.argv[1]]()
Socket socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,应用程序通过“套接字”向网络发出 请求或者应答网络请求。 socket起源于Unix,而unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式 来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO 、打开、关闭) 3.0版本 服务器端:
#!/usr/bin/env python # encoding: utf-8 import socket ip_port = ('127.0.0.1',9999) sk = socket.socket()#如果不指定,则默认为TCP/IP sk.bind(ip_port) sk.listen(5) while True: print("server waiting...") conn,addr = sk.accept() #等待连接进来,服务器会根据客户端连接生成专门的实例#一个客户端有一个专门的实例 client_data = conn.recv(1024)#2014个字节 print(str(client_data,'utf8')) conn.sendall(bytes('不要回答,不要回答,不要回答','utf8')) sk.close() 客户端: #!/usr/bin/env python # encoding: utf-8 import socket ip_port = ('127.0.0.1',9999)#ip 为服务端的地址 sk = socket.socket()#如果不指定,则默认为TCP/IP sk.connect(ip_port) sk.sendall(bytes("请求占领地球",'utf8')) server_reply = sk.recv(1024) print(str(server_reply,'utf8')) sk.close()
1 #!/usr/bin/env python2 # encoding: utf-83 import os,sys,getpass,time
getpass模块 |