1.类的信息
在python中比较常用的类的信息有以下几种,
下面我们来使用一下,
class Animal:
def __init__(self, age):
self.age = age
class Cat(Animal):
pass
print(Cat.__name__, type(Cat.__name__)) # 注意此处返回的是字符串类型
print(Cat.__dict__) # 返回类的信息
print(Cat.__bases__) # 返回该类的父类
print(Cat.__module__) # 返回类所在的模块
print(Cat.__mro__) # 返回类的继承顺序
执行结果如下,
Cat <class 'str'>
{'__module__': '__main__', '__doc__': None}
(<class '__main__.Animal'>,)
__main__
(<class '__main__.Cat'>, <class '__main__.Animal'>, <class 'object'>)
2.对象的信息
下面我们以举例的方式来讲解一下对象的常见信息,
class Animal:
def __init__(self, age):
self.age = age
class Cat(Animal):
pass
c1 = Cat(5)
print(dir(c1)) # 返回对象的信息
print(c1.__dict__) # 返回对象属性字典
print(c1.__module__) # 返回对象的模块名
print(c1.__class__) # 返回对象所属类的类名的类名,注意返回的不是类名字符串
执行结果如下,
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age']
{'age': 5}
__main__
<class '__main__.Cat'>
3.常见类函数
在python中比较常用的类函数有以下几种,
下面我们来使用一些,
class Animal:
def __init__(self, age):
self.age = age
class Cat(Animal):
pass
c1 = Cat(5)
print(issubclass(Cat, Animal)) # 判断第一个参数是不是第二个参数的子类,是返回True,不是返回False
print(isinstance(c1, Cat)) # 判断类型,可以判断对象是否属于类
print(hasattr(c1, "age")) # 判断对象(第一个参数)是否有该属性(第二个参数),注意属性需要是字符串类型
print(getattr(c1, "age")) # 输出对象的属性值
print(callable(c1)) # 判断一个对象是否可以被调用
执行结果如下,
True
True
True
5
False
我们可以给类添加__call__魔术方法,使对象可以被调用,
class Animal:
def __init__(self, age):
self.age = age
class Cat(Animal):
def __call__(self, *args, **kwargs):
pass
print(callable(c1))
执行结果如下,
True
4.异常处理
4.1.try-except语句
错误指的是代码有语法问题,⽆法解释运⾏,必须改正后才能运⾏。
如果代码没有语法问题,可以运⾏,但会出运⾏时的错误,例如除零错误,下标越界等问题,这种在运⾏期间检测到的错误被称为异常,出现了异常必须处理否则程序会终⽌执⾏,⽤户体验会很差。python⽀持程序员自己处理检测到的异常。我们可以使用try-except语句进行异常的检测和处理。
例如,
try:
print(1 / 0) # 被检测的代码块
except ZeroDivisionError as e: # 指定可能出现的错误,我们这里指定ZeroDivisionError
print(e) # 如果出现上面提到的错误会执行该块代码
执行结果如下,
division by zero
注意,我们可以对于出现的不同类错误可以有不同的解决代码,例如,
try:
print(1 / 0)
except ZeroDivisionError as e: # 可能出现的第二种错误
print(e)
except StopIteration as e: # 可能出现的第二种错误
print(e)
注意,如果检测代码块出现异常,则不会继续向下执行,而是直接跳转到except语句。
例如,
try:
print(1 / 0)
print("*" * 100)
except ZeroDivisionError as e:
print(e)
执行结果如下,
division by zero
我们可以看到print("*" * 100)该句并未被执行。
我们还可以在try-except语句后加入else语句和finally语句。else语句是如果没有检测到异常则会执行else语句。finally语句是一定会被执行的语句,不管有没有异常。例如,
try:
print(1 / 1)
except ZeroDivisionError as e:
print(e)
else:
print("没有异常")
finally:
print("结束")
执行结果如下,
1.0
没有异常
结束
4.2.抛出异常
⼿动抛出⼀个指定类型的异常,⽆论是哪种异常类都可以带⼀个字符串参数,对异常进⾏描述。
raise不带参数会把错误原样抛出。
try:
raise ZeroDivisionError('除0错误')
# raise ZeroDivisionError #如果不想获取错误信息,可以不带参数
except ZeroDivisionError as e:
print(e) #除0错误
执行结果如下,
除0错误
4.3.自定义异常类
如果系统异常类型满⾜不了业务需求,那么可以⾃⼰定义异常类来处理。
注意,⾃⼰定义的异常类必须继承BaseException或Exception。
下面我们来定义一个异常类,
class CustomException(Exception): # 继承系统的异常处理类
def __init__(self, msg):
super().__init__() # 调用父类的构造方法
self.msg = msg
def __str__(self): # 重做__str__魔术方法
return self.msg
def handle(self):
print("异常处理方法") # 自定义异常的处理方法
4.4.异常嵌套
与循环、判断等语句一样,异常可以进行嵌套。