上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用)。

静态方法

静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法;

说了那么多,估计会有些懵逼,咱们还是直接上代码看下静态方法怎么使用吧!

1.按照正常逻辑编写代码并加上@staticmethod定义静态方法eat:

class People(object):
def __init__(self,name):
self.name = name @staticmethod #把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name) d = People("cc")
d.eat()

运行上面代码,我们会发现报以下错误:

TypeError: eat() missing 1 required positional argument: 'self'

----------eat需要一个self参数,但调用时却没有传递

so...我们可以得出一个结论:eat变成静态方法后,再通过实例调用时不会自动把实例本身当作一个参数传给self

2.解决办法:

1)调用时主动传递实例本身给eat方法,即d.eat(d)

class People(object):
def __init__(self, name):
self.name = name @staticmethod # 把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name)
d = People("cc")
d.eat(d)
#------打印输出------
#cc is eating

2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)

class People(object):
def __init__(self, name):
self.name = name @staticmethod # 把eat方法变为静态方法
def eat():
print("%s is eating" % self.name) d = People("cc")
d.eat()
#------------------打印输出----------------
#print("%s is eating" % self.name)
#NameError: name 'self' is not defined

类方法

类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。类对象和实例都可以调用类方法。

类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。

依然还是原来的代码,把eat变为类方法看下:

class People(object):
def __init__(self, name):
self.name = name @classmethod # 把eat方法变为类方法
def eat(self):
print("%s is eating" % self.name) d = People("cc")
d.eat()
---------------打印输出-------------------
print("%s is eating" % self.name)
AttributeError: type object 'People' has no attribute 'name'

报错说明:People没有name属性;

上面说过,类方法只能访问类变量,不能访问实例变量,而name在这里就是实例变量。

我们加上一个类变量试试:

class People(object):
name = "类变量"
def __init__(self, name):
self.name = name @classmethod # 把eat方法变为类方法
def eat(self):
print("%s is eating" % self.name) d = People("cc")
d.eat()
--------------------打印输出-------------------
类变量 is eating

属性方法

属性方法的作用就是通过@property把一个方法变成一个静态属性;

依然还是之前的代码,把eat方法变成静态属性看下效果:

class People(object):
name = "请叫我类变量"
def __init__(self, name):
self.name = name @property # 把eat方法变为静态属性
def eat(self):
print("%s is eating" % self.name) d = People("cc")
d.eat() -----------------打印输出--------------------
d.eat()
TypeError: 'NoneType' object is not callable

这里报错是因为eat已经变成了一个静态属性,当然不能再使用()去调用了,我们直接调用试试:

d.eat

-------------打印输出------------
cc is eating

反射

1.反射的定义

根据字符串的形式去某个对象中操作成员

  • 根据字符串的形式去一个对象中寻找成员
  • 根据字符串的形式去一个对象中设置成员
  • 根据字符串的形式去一个对象中删除成员
  • 根据字符串的形式去一个对象中判断成员是否存在

2. 反射的函数

  • getattr(object, name[, default])

根据字符串的形式去一个对象中寻找成员

class People(object):
def __init__(self):
self.name = 'cc'
def eat(self):
return 'HI'
d = People()
ret1 = getattr(d,'eat')
ret2 = getattr(d,'name')
r1 = ret1()
print(r1)
print(ret2) --------------打印输出----------------
HI
cc
  • setattr(object, name, value)

根据字符串的形式去一个对象中设置成员

class People(object):
def __init__(self):
self.name = 'cc'
def eat(self):
return 'HI'
d = People()
set1 = setattr(d,'age',18)
r1 = getattr(d,'age')
print(r1) -----------------------打印输出---------------------------
18
  • delattr(object, name)

根据字符串的形式去一个对象中删除成员

class People(object):
def __init__(self):
self.name = 'cc'
def eat(self):
return 'HI'
d = People()
del1 = delattr(d,'name')
r1 = getattr(d,'name')
print(r1) ----------------打印输出-------------------
AttributeError: 'People' object has no attribute 'name'
  • hasattr(object, name)

根据字符串的形式去一个对象中判断成员是否存在

class People(object):
def __init__(self):
self.name = 'cc'
def eat(self):
return 'HI'
d = People()
h1 = hasattr(d,'age')
h2 = hasattr(d,'name')
print(h1,h2) ---------------打印输出-----------------
False True

异常处理(缺少else和finally)

在之前学习的过程中我们会接触到各式各样的报错信息,编程过程中为了增加友好性,可以抓取相对应的错误并给出提示信息。

常用异常:

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

常用异常实例:

IndexError(输出指定错误信息并打印错误信息)

dic = [1,2]
try:
dic[2]
except IndexError as e :
print("i got it!\n",e) ---------------------------打印输出--------------------------
i got it!
list index out of range

KeyError(输出指定错误信息并打印错误信息)

dic = {'name':'cc'}
try:
dic['age']
except KeyError as e :
print("i got it!\n",e) ---------------------------打印输出---------------------------
i got it!
'age'

ValueError

s1 = 'hello'
try:
int(s1)
except ValueError as e:
print (e) ---------------------------打印输出----------------------------
invalid literal for int() with base 10: 'hello'

万能异常Exception:(不建议用,不便于调试;可与异常配合使用)

s1 = 'hello'
try:
int(s1)
except KeyError as e:
print('键错误')
except IndexError as e:
print('索引错误')
except Exception as e:
print('错误')

自定义异常:

class ccException(Exception):
def __init__(self,msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise ccException("我的异常")
except ccException as e:
print(e) 

python学习笔记-(十一)面向对象进阶&异常处理的更多相关文章

  1. python 学习笔记十一 SQLALchemy ORM(进阶篇)

    SqlAlchemy ORM SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据A ...

  2. python学习笔记六 面向对象相关下(基础篇)

    面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以将多函数中公用的变量封装到对象中) 对象,根据模板创建的 ...

  3. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  4. python 学习笔记十三 JQuery(进阶篇)

    jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. 安装jQuery 有两个版本的 jQuery 可供下载: Production versio ...

  5. python学习笔记_week6_面向对象

    面向对象 介绍(特性(class.object--->封装.继承,多态)).--->世界万物,皆可分类:世界万物,皆可对象 只要是对象,就肯定属于某种品类:只要是对象,就肯定有属性 你是上 ...

  6. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  7. Python学习笔记016——面向对象

    面向对象是指用类来描述一个对象(实例),用类来建立实例与实例的关联关系 对象 : object     实例 : instance 1 类 1.1 什么是类 类是用来描述对象的工具,用类可以创建一个或 ...

  8. python学习笔记(七):面向对象编程、类

    一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...

  9. python学习笔记(6)--面向对象学习

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.   引言 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做(人狗大战)的游戏,你就思 ...

  10. python学习笔记(10):面向对象

    一.类和实例 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 2.对象:通过类定义的数据结构实例.对象包括两个数据成员( ...

随机推荐

  1. SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享

    这个问题是在SQL SERVER 2005 升级到SQL SERVER 2014的测试过程中一同事发现的.我觉得有点意思,遂稍微修改一下脚本展示出来,本来想构造这样的一个案例来演示,但是畏惧麻烦,遂直 ...

  2. IIS不能下载ini文件

    1.打开IIS. 2.选择站点或者存放*.ini文件的目录,右键菜单中选择属性. 3.选择“HTTP头”选项卡. 4.点击“MINE类型”. 5.点击“新建”. 6.这是跳出一个对话框,在“扩展名”一 ...

  3. MongoDB学习笔记~批量插入方法的实现

    回到目录 批量插入在EF时代大叔就自己封装过,原理是将多次SQL连接和多次向SQL发送的指令减少到1次,或者1000条数据1次,而对于EF产生的语句来说,这无疑是性能高效的,因为EF这边在处理时,每个 ...

  4. 【转】Hive内部表、外部表

    hive内部表.外部表区别自不用说,可实际用的时候还是要小心. 1. 内部表: create table tt (name string , age string) location '/input/ ...

  5. openstack命令备忘录

    原文http://my.oschina.net/u/138210/blog/142661 查看rabbitmq 队列 rabbitmqctl list_queues 查看keystone的用户 key ...

  6. 自定义shiro的Realm实现和CredentialsMatcher实现以及Token实现

    Realm是shiro比较核心的接口,简单说它的实现类就是校验用户输入的账号信息的地方.如果想自定义实现一般的配置文件如下: <!--自定义Realm 继承自AuthorizingRealm - ...

  7. DNS查找域名的过程

    当我们在浏览器输入一个url地址时,需要获取到这个url的域名,本篇文章主要介绍了关于DNS查找解析域名的过程的一些东西. 关于DNS 不清楚DNS的小伙伴可以点这里:关于域名系统DNS解析IP地址的 ...

  8. 如何用Maven创建web项目

    使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...

  9. [No000089]String的(补空位)左对齐,(补空位)右对齐

    using System; namespace Chinese中文排序Sort { internal class Program { /// <summary> /// 取子字符串 /// ...

  10. 玩KVM

    按照网上的一篇博客玩KVM,结果wifi上不了网,上不了网! 把br0下线就好了! 呀------ 11月16日,今天发现kvm卡成屎可能是和kvm内存使用率为0相关,虚拟机中的内存显示内存确实是我配 ...