Python--day7

  1. 类的静态方法及属性

多态:多态即为接口的重用(父类调用子类)


 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())
View Code

类的成员:字段(普通字段、静态字段)、方法(普通方法、类方法、静态方法)、属性
字段也就是变量的意思,普通字段即实例变量。静态字段即类变量

类的方法:
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
View Code

getpass模块

 

原文地址:https://www.cnblogs.com/sd880413/p/8075261.html