- 类的静态方法及属性
多态:多态即为接口的重用(父类调用子类)
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 python 2 # encoding: utf-8 3 import os,sys,getpass,time
getpass模块 |