类:属性;
实例变量
类变量
私有属性__var
方法:
构造方法
析构函数
私有方法
对象:实例化得到的一个对象;
继承
继承,组合
代码重用
单继承
多继承;3.X广度优先;;2.7经典类,深度优先;新式类,广度优先;
多态:接口重用;;
静态方法:
class Dog(object): def __init__(self, name): self.name = name @staticmethod #实际上跟类没什么关系了 def eat(self, food): print("%s is eating %s" % (self.name, food)) d = Dog("ChenRong") d.eat()
以上程序无法执行;
静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性;
类方法:只能访问类变量,不能访问实例变量;
class Dog(object): #n = "3333" name = "hauzai" def __init__(self, name): self.name = name #self.n = 333322 #@staticmethod #实际上跟类没什么关系了 @classmethod def eat(self): print("%s is eating %s" % (self.name,'baozi')) d = Dog("ChenRong") d.eat()
属性方法:把一个方法变成一个静态属性;
class Dog(object): def __init__(self, name): self.name = name #@staticmethod #实际上跟类没什么关系了 #@classmethod @property #attribute def eat(self): print("%s is eating %s" % (self.name,'baozi')) d = Dog("ChenRong") d.eat
例子(调用属性,修改它,删除它)
class Dog(object): def __init__(self, name): self.name = name #@staticmethod #实际上跟类没什么关系了 #@classmethod @property #attribute def eat(self): print("%s is eating %s" %(self.name,self.__food)) @eat.setter def eat(self,food): print("set to food:",food) self.__food = food @eat.deleter def eat(self): del self.__food print("删除") d = Dog("ChenRong") d.eat= "none" d.eat = "baozi" d.eat del d.eat
例子(属性方法)
class Flight(object): def __init__(self,name): self.flight_name = name def checking_status(self): print("checking flight %s status " % self.flight_name) return 1 @property def flight_status(self): status = self.checking_status() if status == 0 : print("flight got canceled...") elif status == 1 : print("flight is arrived...") elif status == 2: print("flight has departured already...") else: print("cannot confirm the flight status...,please check later") @flight_status.setter #改状态 def flight_status(self, status): print("flight %s has changed status to %s" % (self.flight_name,status)) f = Flight("CA980") f.flight_status f.flight_status = 2
类的特殊成员方法
1. __doc__ 表示类的描述信息
2. __module__ 和 __class__
__module__ 表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么
3. __init__ 构造方法,通过类创建对象时,自动触发执行。
4.__del__
5. __call__ 对象后面加括号,触发执行。
def __call__(self, *args, **kwargs): print("running call",args,kwargs)
6. __dict__ 查看类或对象中的所有成员
print(Dog.__dict__) #打印类里的所有属性,不包括类的属性 print(d.__dict__)#打印所有实例属性,不包括类的属性7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
def __str__(self): return "obj:%s"%self.name
8.__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示获取、设置、删除数据
class Foo(object): def __init__(self): self.data = {} def __getitem__(self, key): print('__getitem__', key) return self.data.get(key) def __setitem__(self, key, value): print('__setitem__', key, value) self.data[key] = value def __delitem__(self, key): print('__delitem__', key) obj = Foo() obj['name'] = "zhang" print(obj['name']) print(obj.data) del obj["name"]D:\Python\python36\python.exe D:/Python/work/day7/getitem.py
__setitem__ name zhang
__getitem__ name
zhang
{'name': 'zhang'}
__delitem__ name
9.__new__ \ __metaclass__
class Foo(object): def __init__(self, name): self.name = name #f = Foo("zhang") #print(type(f)) #print(type(Foo)) def func(self): print('hello zhang %s'%self.name) def __init__(self,name,age): self.name = name self.age = age Foo = type('Foo',(object,),{'talk':func,'__init__':__init__}) f = Foo("guoqi",23) f.talk() print(type(Foo))
class MyType(type): def __init__(self,*args,**kwargs): print("Mytype __init__",*args,**kwargs) def __call__(self, *args, **kwargs): print("Mytype __call__", *args, **kwargs) obj = self.__new__(self) print("obj ",obj,*args, **kwargs) print(self) self.__init__(obj,*args, **kwargs) return obj def __new__(cls, *args, **kwargs): #new 是用来创建实例的 print("Mytype __new__",*args,**kwargs) return type.__new__(cls, *args, **kwargs) print('here...') class Foo(object,metaclass=MyType): def __init__(self,name): self.name = name print("Foo __init__") def __new__(cls, *args, **kwargs): print("Foo __new__",cls, *args, **kwargs) return object.__new__(cls) #继承父类的__new__方法 #第一阶段:解释器从上到下执行代码创建Foo类 #第二阶段:通过Foo类创建object对象 f = Foo("Alex") print("f",f) print("fname",f.name)
class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print("%s is eating..."%self.name,food) d = Dog("alex") choice = input(">>:").strip() if hasattr(d,choice): func = getattr(d,choice) func("baozi")
hasattr(obj,name_str),判断一个对象obj是否有对应的name_str字符串的方法;
getattr(obj,name_str),根据字符串去获取obj对象里的方法的内存地址;
setattr(x, 'y', v) is equivalent to ``x.y = v'';
delattr(x, 'y') is equivalent to ``del x.y'';
def bulk(self): print("%s is yelling....."%self.name) class Dog(object): def __init__(self,name): self.name = name def eat(self,food): print("%s is eating..."%self.name,food) d = Dog("alex") choice = input(">>:").strip() if hasattr(d,choice): delattr(d,choice) #func = getattr(d,choice) #func("baozi") #setattr(d,choice,"huazi") else : #setattr(d,choice,bulk) #d.talk(d) setattr(d,choice,None) print(getattr(d,choice)) #print(d.name) #if choice == 'eat': #d.eat()
10.异常处理
try: data['name'] except KeyError as e: print("没有这个key",e)
try:
names[3] data['name'] except KeyError as e: print("没有这个key",e) except IndexError as e: print("列表错误",e)
抓住所有错误;
try: names[3] data['name'] except Exception as e:#抓住所有错误,不建议用; print("出错了",e)
总结:
try: names[3] data['name'] except Exception as e: print("出错了",e) except KeyError as e: print("没有这个key",e) except IndexError as e: print("列表错误",e) except Exception as e: print("未知错误",e) else: print("一切正常") finally:
print("不管有没有错,都执行")
常用错误::
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
自定义异常:
class AlexException(Exception): def __init__(self,msg): self.message = msg def __str__(self): return "assdajk" #return self.message try: raise AlexException('数据库连不上...') except AlexException as e: print(e)Socket网络编程
OSI七层:应用;表示;绘画;传输;网络ip;数据链路mac;物理层;;
TCP/IP 三次握手;四次断开;
UDP
接受/发送数据的中转站;
65535port机器开放端口; import socket (发送端)
socket.TCP/IP
connect(a.ip,a.port)
socket.send(hello)
socket.close()
import socket(服务器端)
socket.TCP/IP
listen(0.0.0.0,3306)
waiting()
recv()
send
Socket Families(地址簇)
socket.
AF_UNIX unix本机进程间通信
socket.
AF_INET IPV4
socket.
AF_INET6 IPV6
Socket Types
socket.
SOCK_STREAM #for tcp
socket.
SOCK_DGRAM #for udp
socket.
SOCK_RAW #原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
例子::::
#服务端(socket_server) import socket server = socket.socket() server.bind(('localhost',6969)) #绑定要监听的端口 server.listen() #监听 print("我要等电话了") conn, addr = server.accept() # conn就是客户端连过来而在服务端为其生成的一个连接对象 print(conn, addr) # server.accept() #等电话打进来 print("电话来了") while True: data = conn.recv(1024) print("recv:",data) conn.send(data.upper()) server.close()
————————————————————
#客户端(socket_client) import socket client = socket.socket() #声明socket类型,同时生成socket对象 client.connect(('localhost',6969)) while True: msg = input(">>:").strip() client.send(msg.encode("utf-8")) #client.send("我要自学".encode("utf-8")) data = client.recv(1024) print("recv:", data.decode()) client.close()