ITPub博客

首页 > > > python 继承-类的成员-装饰器-反射-异常处理

python 继承-类的成员-装饰器-反射-异常处理

作者:unnamed persona 时间:2019-12-14 14:26:43 0 删除 编辑

继承

继承分为

单继承

多继承

继承的优点

增加了类的耦合性(耦合性不宜多,宜精)。

减少了重复代码。

使得代码更加规范化,合理化。

调用父类的方法

父类.func(对象,其他参数)

super().func(参数)

继承父类的构造函数

super(Person,self).__init__(name,sex,age) # 方法一

super().__init__(name,sex,age) # 方法二

1

2

1

多继承

一个子类继承多个父类

多继承的执行顺序

经典类:沿用深度优先算法。(从左至右,依次查找,每次都选取节点的最左边,一直找到头,如果没有,返回上一个节点在查询其他路线)

新式类:沿用C3算法。()

mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )

(其中Child继承自Base1, Base2)

1

2

super是严格按照对象从属于类的mro顺序执行下一个类

类的成员

类中属性或方法前加"__"可以生成为私有属性

class A:

company_name = '太白' # 静态变量(静态字段)

__iphone = '1353333xxxx' # 私有静态变量(私有静态字段)

def __init__(self,name,age): #特殊方法

self.name = name #对象属性(普通字段)

self.__age = age # 私有对象属性(私有普通字段)

def func1(self): # 普通方法

pass

def __func(self): #私有方法

print(666)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

公有成员,在任何地方都能访问

私有成员,只有在类的内部才能方法

装饰器

使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);

使用装饰器@staticmethod在类中定义函数

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

isinstance(a,b):判断a是否是b类(或者b类的派生类)实例化的对象

issubclass(a,b): 判断a类是否是b类(或者b的派生类)的派生类、

type()中为type的就是元类

反射

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数:hasattr,getattr,setattr,delattr

#检测是否含有某属性

obj为对象

print(hasattr(obj,'name'))

#获取属性

obj为对象

n=getattr(obj,'name')

#设置属性

setattr(obj,'sb',True)

setattr(obj,'show_name',lambda self:self.name+'sb')

# 调用show_name方法

print(obj.show_name(obj))

#删除属性

delattr(obj,'age')

delattr(obj,'show_name')

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

异常处理

常用异常:

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

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

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

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

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

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

KeyboardInterrupt Ctrl+C被按下

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

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

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

UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,

导致你以为正在访问它

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

1

2

3

4

5

6

7

8

9

10

11

12

13

基本语法

try:

被检测的代码块

except 异常类型:

try中一旦检测到异常,就执行这个位置的逻辑

s1 = 'hello'

try:

int(s1)

except IndexError as e:

print e

1

2

3

4

5

6

7

8

9

10

多分支

一个try对应多个except的情况

万能异常

s1 = ‘hello’

try:

int(s1)

except Exception as e:

print(e)

多分支+万能异常

try:

choice = int(input(‘请输入:’))

dicchoice

except ValueError:

print(‘请输入数字…’)

except KeyError:

print(‘您输入的选项超出范围…’)

except Exception as e:

print(e)

与循环中的else比较类似,try代码中,只要出现了异常,则不会执行else语句,如果不出现异常,则执行else语句。

finally

如果出现异常并且成功捕获了,finally会在try中最后执行。

如果出现异常但是没有成功捕获,finally会在异常发生之前执行

关闭文件的链接链接,数据等链接时,需要用到finally。

循环中,finally也会在return之前执行。

raise TypeError(‘类型错误’)

assert 1==2, ‘1 不等于 2’《断言》条件为False报字符传中的错误

————————————————

版权声明:本文为CSDN博主「坚定的蜗牛」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/CSDNzhaojiale/article/details/103515261

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69949628/viewspace-3162776/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-12-04

  • 博文量
    158
  • 访问量
    0