WEEK7:面向对象编程进阶
- 面向对象高级语法部分
- 静态方法、类方法、属性方法
- 静态方法 @staticmethod #此方法实际上跟类已经没什么关系了,此时就是单纯的函数,无法直接调用类变量,但是可以通过传进去实例调用类变量。静态方法只是名义上归类管理,实际上在静态方法里访问不了类或者实例中的任何属性
1 import os 2 3 class Dog(object): 4 def __init__(self,name): 5 self.name = name 6 7 @staticmethod #此方法实际上跟类已经没什么关系了,此时就是单纯的函数,无法直接调用类变量和实例变量,但是可以通过传进去实例调用实例变量 8 def eat(self): 9 print("%s is eating %s" %(self.name,'dd')) 10 11 def talk(self): 12 print("%s is talking"% self.name) 13 d = Dog("ChenRonghua") 14 d.eat(d) 15 d.talk()
- 类方法 @classmethod #只能访问类变量,不能访问实例变量
1 import os 2 3 class Dog(object): 4 name = "huazai" 5 def __init__(self,name): 6 self.name = name 7 @classmethod #只能访问类变量,不能访问实例变量 8 def eat(self): 9 print("%s is eating %s" %(self.name,'dd')) 10 11 def talk(self): 12 print("%s is talking"% self.name) 13 14 15 d = Dog("ChenRonghua") 16 d.eat()
- 属性方法 @property #把一个方法变成静态属性,调用的时候不需要加(),无法传递参数
1 import os 2 3 class Dog(object): 4 '''这个类是描述狗这个对象的''' 5 6 def __init__(self,name): 7 self.name = name 8 self.__food = None 9 10 @property #把一个方法变成静态属性,调用的时候不需要加() 11 def eat(self): 12 print("%s is eating %s" %(self.name,self.__food)) 13 @eat.setter 14 def eat(self,food): 15 print("set to food:",food) 16 self.__food = food 17 @eat.deleter 18 def eat(self): 19 del self.__food 20 print("删完了") 21 22 d = Dog("ChenRonghua") 23 d.eat 24 d.eat="baozi" 25 d.eat 26 del d.eat 27 d.eat
- 静态方法 @staticmethod #此方法实际上跟类已经没什么关系了,此时就是单纯的函数,无法直接调用类变量,但是可以通过传进去实例调用类变量。静态方法只是名义上归类管理,实际上在静态方法里访问不了类或者实例中的任何属性
- 类的特殊方法
- __doc__ #表示类的描述信息,即类开头的注释信息
- __module__ #表示当前操作系统的对象在哪个模块
- __class__ #表示当前操作的对象的类是什么
1 aa.py 2 3 class C: 4 5 def __init__(self): 6 self.name = 'alex' 7 8 index.py 9 10 from lib.aa import C 11 obj = C() 12 print(obj.__module__) # 输出 lib.aa,即:输出模块 13 print(obj.__class__ ) # 输出 lib.aa.C,即:输出类
- __init__ #构造方法,通过类创建对象时,自动触发执行
- __del__ #析构方法,当对象在内存中被释放时,自动触发执行。
- __call__ #对象后面加(),触发执行。构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
1 class Foo: 2 def __init__(self): 3 pass 4 5 def __call__(self, *args, **kwargs): 6 7 print '__call__' 8 9 obj = Foo() # 执行 __init__ 10 obj() # 执行 __call__
- __dict__ #查看类或对象中的所有成员。通过类调用,输出的是类里的所有属性,不包括实例属性。通过实例调用,打印所有实例属性,不包括类属性
- __str__ #如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值
- __getitem__ 、__setitem__、__delitem__ #用于索引操作,如字典,分别表示获取、设置、删除数据
- __new__、__metaclass__ #https://www.cnblogs.com/alex3714/articles/5213184.html
- 类的起源与metaclass
1 def func(self): 2 print('hello %s' %self.name) 3 def __init__(self,name,age): 4 self.name = name 5 self.age = age 6 7 Foo = type('Foo', (object,), {'talk': func, 8 '__init__':__init__}) 9 f = Foo("Chrn",22) 10 f.talk() 11 print(type(Foo))
- 类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__
![]()
- 类的起源与metaclass
- 反射 #通过字符串映射或修改程序运行时的状态、属性、方法,有以下四种方法:
- getattr(object, name_str, default=None) #根据字符串name_str去获取object对象里的对应的方法的内存地址
- hasattr(object,name_str) #判断一个对象object里是否有对应的name_str字符串的方法
- setattr(object,name_str,new_func) #在实例object中添加名字为name_str的方法new_func函数
- delattr(object,name_str) #删除对象object中的方法name_str
1 def bulk(self): 2 print("%s is yelling...." %self.name) 3 4 class Dog(object): 5 def __init__(self,name): 6 self.name = name 7 8 def eat(self,food): 9 print("%s is eating..."%self.name,food) 10 11 d = Dog("NiuHanYang") 12 choice = input(">>:").strip() 13 14 if hasattr(d,choice): #判断是否有choice输入的这个方法 15 func=getattr(d,choice) #有,则调用类方法 16 func("chenronghua") 17 else: 18 setattr(d,choice,bulk) #给类添加新的方法bulk 19 func = getattr(d, choice) #调用刚刚添加的新方法 20 func(d)
- 静态方法、类方法、属性方法
- 异常处理
- 异常处理结构
1 try: 2 # 主代码块 3 pass 4 except KeyError,e: 5 # 异常时,执行该块 6 pass 7 else: 8 # 主代码块执行完,执行该块 9 pass 10 finally: 11 # 无论异常与否,最终执行该块 12 pass
1 names = ['alex','jack'] 2 try: 3 data['name'] 4 except KeyError as e : #每种错入一种处理方法,如果前两种处理方法一样则except (KeyError,IndexError) as e,如果所有错误使用同一种处理方法则except Exception as e 5 print("没有这个key",e) 6 except IndexError as e : 7 print("列表操作错误",e) 8 except BaseException as e: #除去以上两种之外的其他错误,或者在最后面使用Exception 9 print("未知错误",e) 10 else: 11 print("一切正常") 12 finally: 13 print("不管有没有错,都执行")
- 常见错误
- AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它 - ValueError 传入一个调用者不期望的值,即使值的类型是正确的
- 自定义异常与主动触发异常
- 格式
1 #主动触发异常 2 try: 3 raise Exception('错误了。。。') 4 except Exception,e: 5 print e 6 7 #自定义异常 8 class WupeiqiException(Exception): 9 10 def __init__(self, msg): 11 self.message = msg 12 13 def __str__(self): 14 return self.message 15 16 try: 17 raise WupeiqiException('我的异常') 18 except WupeiqiException,e: 19 print e
- 实例
1 class AlexError(Exception): 2 def __init__(self, msg): 3 self.message = msg 4 5 try: 6 raise AlexError('数据库连不上') 7 except AlexError as e: 8 print(e)
- 格式
- 异常处理结构
- Scoket开发基础
- Socket介绍
- 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.SOCK_RDM #是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用
- Socket Families(地址簇)
- Socket参数介绍
- 实例
- 客户端
1 #客户端 2 import socket 3 4 client = socket.socket() #声明socket类型,同时生成socket连接对象 5 client.connect(('localhost',6969)) 6 7 while True: 8 msg = input(">>:").strip() 9 if len(msg) == 0:continue 10 client.send(msg.encode("utf-8")) 11 data = client.recv(1024) #一次最大接收1024个字节 12 print("recv:",data.decode()) 13 14 client.close()
- 服务端
1 #服务器端 2 import socket 3 server = socket.socket() 4 server.bind(('localhost',6969)) #绑定要监听端口 5 server.listen() #监听 6 7 print("我要开始等电话了") 8 while True: 9 conn, addr = server.accept() # 等电话打进来 10 # conn就是客户端连过来而在服务器端为其生成的一个连接实例 11 print(conn, addr) 12 print("电话来了") 13 while True: 14 data = conn.recv(1024) 15 print("recv:",data) 16 if not data: #接收到的数据为空则断开 17 print("client has lost...") 18 break 19 conn.send(data.upper()) 20 21 server.close()
- 客户端
- Socket介绍
仰天大笑出门去,吾辈岂是蓬蒿人!


浙公网安备 33010602011771号