一、类的特殊方法

  1、静态方法

  静态方法只是封装在类中的一个普通函数,其和类没有什么关系,但只可以通过类来调用,不能访问实例或类中的任何属性。

  使用 @staticmethod 声明可以将一个方法声明为静态方法:

class Dog(object):def __init__(self,name):self.name = name@staticmethod  #将eat方法声明为静态方法def eat(self,food):print("%s正在吃%s" % (self.name,food))dog1 = Dog("哈士奇")
dog1.eat("狗粮")

  上述代码会在运行时报错,原因在于eat方法要求传入self,food两个参数,而我们实际上只传入了一个参数。如果想避免这个错误,有两种方法:

  (1)、调用时传入自身

class Dog(object):def __init__(self,name):self.name = name@staticmethoddef eat(self,food):print("%s正在吃%s" % (self.name,food))dog1 = Dog("哈士奇")
dog1.eat(dog1,"狗粮")

  (2)、定义eat方法时去掉self参数,但是问题又出现了,去掉self后,就没法使用self来调用其他参数了

  2、类方法

  类方法只能访问类变量,不能访问实例变量

  使用 @classmethod 将一个方法声明为类方法

class Dog(object):def __init__(self,name):self.name = name@classmethod  #将eat方法声明为类方法def eat(self,food):print("%s正在吃%s" % (self.name,food))dog1 = Dog("哈士奇")
dog1.eat("狗粮")运行结果:
Traceback (most recent call last):File "/Users/zhanghaoyan/PycharmProjects/day07/blog_code.py", line 14, in <module>dog1.eat("狗粮")File "/Users/zhanghaoyan/PycharmProjects/day07/blog_code.py", line 10, in eatprint("%s正在吃%s" % (self.name,food))
AttributeError: type object 'Dog' has no attribute 'name'

  上述代码运行结果可以看到,报错提示我们Dog类没有name属性,因为name属性是实例的属性,所以类方法没法访问。如果定义一个类变量叫name,那么就可以访问了。

  3、属性方法

  顾名思义,属性方法就是像调用一个类的属性一样的去调用一个方法,即在调用的时候不加()。这玩意儿看起来好没用的感觉,当调用一个外部接口时,我们是不需要知道外部接口是如何工作的,所以,为了装逼不被拆穿,我们就搞个属性方法出来:

class Dog(object):def __init__(self,name):self.name = namedef eat(self,food):print("%s正在吃%s" % (self.name,food))class Flight(object):def __init__(self,flight_num):self.num = flight_numdef check_status(self):print("check flight %s status:" % self.num)return 1@property    #声明flight_status为属性方法def flight_status(self):status = self.check_status()status_dic = {1:"arrived!",2:"fling!",3:"late!"}print(status_dic[status])flight1 = Flight("NH180")
flight1.flight_status运行结果:
check flight NH180 status:
arrived!

  从上述代码中我们可以看到,在调用flight_status方法时,并没有(),而是像属性一般去调用。既然已经伪装成属性了,那我们更改一下这个属性的值:

class Dog(object):def __init__(self,name):self.name = namedef eat(self,food):print("%s正在吃%s" % (self.name,food))class Flight(object):def __init__(self,flight_num):self.num = flight_numdef check_status(self):print("check flight %s status:" % self.num)return 1@propertydef flight_status(self):status = self.check_status()status_dic = {1:"arrived!",2:"fling!",3:"late!"}print(status_dic[status])flight1 = Flight("NH180")
flight1.flight_status = 2
flight1.flight_status运行结果:
Traceback (most recent call last):File "/Users/zhanghaoyan/PycharmProjects/day07/blog_code.py", line 31, in <module>flight1.flight_status = 2
AttributeError: can't set attribute

更改属性方法值

  从代码的运行结果看出,报错说不能更改属性,卧槽,暴露了,这逼装的一点都不像了,其实还是有方法让我们把这个逼装的更到位一些的:

class Dog(object):def __init__(self,name):self.name = namedef eat(self,food):print("%s正在吃%s" % (self.name,food))class Flight(object):def __init__(self,flight_num):self.num = flight_numdef check_status(self):print("check flight %s status:" % self.num)return 1@propertydef flight_status(self):status = self.check_status()status_dic = {1:"arrived!",2:"fling!",3:"late!"}print(status_dic[status])@flight_status.setterdef flight_status(self,status):self.check_status()status_dic = {1:"arrived!",2:"fling!",3:"late!"}print(status_dic[status])@flight_status.deleterdef flight_status(self):print("删除了!")flight1 = Flight("NH180")
flight1.flight_status = 2del flight1.flight_status运行结果:
check flight NH180 status:
fling!删除了!

  从上述结果可以看出,我们对该属性方法做了更改甚至删除,这是因为,使用 @属性方法名.setter 这个方法可以设置该属性方法,其下修饰的是一个全新的与属性方法同名的新方法。而 @属性方法名.deleter 修饰可以删除该属性方法。

  3、类的特殊成员方法

  __doc__:打印类的描述信息

  __module__:表示当前操作的对象在哪个模块

  __class__:表示当前操作的对象的类是什么

  __call__:对象后面加括号,触发执行。构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

  __dict__:查看类或对象中的所有成员,以字典的方法打印出来,类调用时不包括实例属性,实例调用的时候不包括类属性

  __getitem__、__setitem__、__delitem__:操作索引

二、反射

  反射是指:通过字符串映射或修改程序运行时的状态、属性、方法:

  hasattr(obj,str):判断对象obj中是否有对应str的方法,是返回True,否返回False

  getattr(obj,str):返回对象obj中字符串str对应的方法的内存地址

  setattr(obj,str,new):新增方法或属性,其中new是要添加的方法或属性,需要提请定义好

  delattr(obj,str):删除obj.str方法

class Dog(object):def __init__(self,name):self.name = namedef eat(self,food):print("%s正在吃%s" % (self.name,food))dog1 = Dog("单身狗")
print("hasattr: ",hasattr(dog1,"eat"))运行结果:
hasattr:  True

hasattr

class Dog(object):def __init__(self,name):self.name = namedef eat(self,food):print("%s正在吃%s" % (self.name,food))dog1 = Dog("单身狗")
print("getattr: ",getattr(dog1,"eat"))运行结果:
getattr:  <bound method Dog.eat of <__main__.Dog object at 0x101b78e80>>

getattr

def bulk(self):print("%s: 汪汪汪!!" % self.name)class Dog(object):def __init__(self,name):self.name = namedef eat(self,food):print("%s正在吃%s" % (self.name,food))dog1 = Dog("单身狗")
setattr(dog1,"folk",bulk)
dog1.folk(dog1)运行结果:
单身狗: 汪汪汪!!

setattr

class Dog(object):def __init__(self,name):self.name = namedef eat(self,food):print("%s正在吃%s" % (self.name,food))dog1 = Dog("单身狗")
print("before delete function eat,has eat?",hasattr(dog1,"eat"))
delattr(dog1,'eat')
print("after delete function eat,has eat?",hasattr(dog1,"eat"))运行结果:
before delete function eat,has eat? True
after delete function eat,has eat? False

delattr

三、异常处理

 1、在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面。

  try:
    code    #程序代码
  except (ERRORNAME,...,) as xx: #捕捉错误
    code    #捕捉到错误后执行的操作
  except ... as xxx:
    code    #将错误重命名
  else: 
    code    #没出错的时候执行else部分的代码
  finally: 
    code    #不管有错没错都执行finally中的代码

  万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:

  try:
    code
  except Exception:
     code

  2、常见及不常见异常:

  AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

  IOError 输入/输出异常;基本上是无法打开文件

  ImportError 无法引入模块或包;基本上是路径问题或名称错误

  IndentationError 语法错误(的子类) ;代码没有正确对齐

  IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

  KeyError 试图访问字典里不存在的键

  KeyboardInterrupt Ctrl+C被按下

  NameError 使用一个还未被赋予对象的变量

  SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

  TypeError 传入对象类型与要求的不符合

  UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

  ValueError 传入一个调用者不期望的值,即使值的类型是正确的

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多异常

  3、 自定义异常

class ourException(Exception):def __init__(self, msg):self.message = msgdef __str__(self):return self.messagetry:raise ourException('我的异常')
except ourException as e:print e

更多异常相关:http://www.cnblogs.com/wupeiqi/articles/5017742.html

四、socket基础

参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html 

转载于:https://www.cnblogs.com/crafts-zhang/articles/5853751.html

python学习笔记7--面向对象进阶,异常处理,socket编程初识相关推荐

  1. Python学习笔记:面向对象高级编程(完)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  2. Python学习笔记:面向对象高级编程(中下)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记:面向对象高级编程(中上)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习笔记:面向对象高级编程(上)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:面向对象编程(4)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. Python学习笔记:面向对象编程(3)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python学习笔记:面向对象编程(2)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. Python学习笔记:面向对象编程(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  9. 【廖雪峰Python学习笔记】面向对象编程OOP

    面向对象编程 OOP:Object Oriented Programming 程序的基本单元:对象 [ = 数据 + 操作数据的函数] [属性 + 方法] 三大特点:数据封装.继承和多态 OPP中的计 ...

  10. 【Python学习笔记】面向对象三大特性

    2019独角兽企业重金招聘Python工程师标准>>> ★面向对象:封装.继承和多态是面向对象的三大特点★ 面向对象编程简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元 ...

最新文章

  1. 处理JSON格式的数据
  2. java中ArrayList与LinkedList的区别
  3. Acwing第 7 场周赛【未完结】
  4. Linux下使用socket传输文件的C语言简单实现
  5. php include无效,php 两次include后,第一个include里的变量无效了
  6. joblib多线程、多进程学习案例(一)——一步步写多进程任务
  7. plsql导出表结构_mysqldump命令详解 Part 5-按条件备份表数据
  8. SAP License:雾里看花系列——SAP顾问应该脱离”保姆”的角色
  9. Oracle入门第二天(下)——单行函数
  10. Spring使用内存数据库
  11. java 泛型编程_java 泛型编程简介
  12. Cannot negotiate authentication mechanism svn: Unable to connect to a repository at URL 'svn://gite
  13. 最大堆(创建、删除、插入和堆排序)图文详解
  14. raise_for_status()方法
  15. Windows xp定时关机命令
  16. 2021周记16:父母和4平米的出租房
  17. 聊聊如何申请技术专利
  18. angr符号执行用例解析——CSCI-4968-MBE
  19. HDU 1870 愚人节的礼物
  20. 使用Python播放MIDI音符

热门文章

  1. (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
  2. 干货 | 局部特征图像配准用于缺陷检测
  3. 实时“头发-面部皮肤”分割与人脸肤色分类
  4. ICCV 2019 Oral 端到端任意形状场景文字识别
  5. java pdf版本转换_Java 转换 PDF 版本
  6. python decorator. decorator_Python 装饰器Decorator(一)
  7. python也能写emoji表情?两个函数解决两者之间的联系
  8. linux使用苹果字体,Ubuntu 8.04字体美化之安装苹果丽黑字体教程(图)
  9. 计算机内部总线和外部总线,科学网-怎样将计算机内部总线扩展为外部网络?-姜咏江的博文...
  10. 数据结构期末复习之交换排序