面对对象4 Mixins机制 内置方法 反射 异常

Mixins机制

为什么要有:子类继承父类的时候,可能会碰到需要继承多个父类的情况,那么继承关系也分主类和辅类,既保持主类的功能,也有辅类的功能。

命名方式,我们需要将主类和辅类区分开来,python 对于mixin类的命名方式一般以 Mixin, able, ible 为后缀,然后一般按照规范,调用的时候辅类应该在主类的左边。

class Vehicle:  # 交通工具
    pass


class FlyableMixin:
    def fly(self):
        '''
        飞行功能相应的代码        
        '''
        print("I am flying")


class CivilAircraft(FlyableMixin, Vehicle):  # 民航飞机
    pass


class Helicopter(FlyableMixin, Vehicle):  # 直升飞机
    pass


class Car(Vehicle):  # 汽车
    pass

内置方法

定义在类的内部,双下划线开头并以上下划线结尾的方法

它的特点是,在某种情况下会自动触发执行

为了定制化我的类或者对象

str内置方法

# __str__下面return什么,打印对象就会打印出来什么,但返回值必须是str类型才可以,否则会报错,当然,这个内置方法里如果有代码,也会在打印对象的时候,触发执行

class People():
  def __init__(self,name,age):
    self.name = name
    self.age = age
    
    
  def __str__(self):
    return '名字:%s 年龄:%s'%(self.name,self.age)
  
  
obj = People('jesse','13')
print(obj)

# 输出结果 名字:jesse 年龄:13

del内置方法

# 在删除对象时触发,会先执行该方法
class People():
  def __init__(self,name,age):
    self.name = name
    self.age = age
    
    
  def __del__(self):
    print('run...')  # 用来标记执行了该方法
  
  
obj = People('jesse','13')
del obj
# 在程序运行完毕之后也会触发执行该方法,因为这涉及到一个内存回收机制,当这个对象的内存被回收,就相当于执行了删除操作

相对比较重要的

isinstance

isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

语法:isinstance(object, classinfo)
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组

如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。

a = 2
isinstance (a,int)
# True
isinstance (a,str)
# False
isinstance (a,(str,int,list))    # 是元组中的一个返回 True
# True

issubclass

issubclass()方法用于判断参数 class 是否是类型参数 classinfo 的子类

语法:issubclass(class, classinfo)

  • class -- 类。
  • classinfo -- 类。

如果 class 是 classinfo 的子类返回 True,否则返回 False。

class A:
    pass
class B(A):
    pass
    
print(issubclass(B,A))

# 返回 True

getattr方法

# __getattr__方法
# 访问类或者对象里面的一个属性,如果不存在就会执行该方法,且会同时默认返回None,可以设置返回值    
class Foo:
    x = 1

    def __init__(self, y):
        self.y = y

    def __getattr__(self,item):
        print('from getattr==>属性不存在')

setattr方法

为对象设置值的时候触发,对象中属性中有值的时候也会触发

delattr方法

删除值的时候触发

call方法

calss Foo:
  def __init__(self):
    pass

  def __call__(self,*args,**kwargs):
    print('__call__')
    
    
obj = Foo()
obj()
# 输出 __call__

# 在对象加括号到用的时候就会执行__call__方法
greater than  大于  python中简写成 gt
less than  小于  python中简写成  lt
equal   等于  e
大于等于  gte
小于等于  lte

反射

python是动态语言,而反射(reflection)机制被视为动态语言的关键。

反射机制指的是在程序的运行状态中

对于任意一个类,都可以知道这个类的所有属性和方法;

对于任意一个对象,都能够调用他的任意方法和属性。

这种动态获取程序信息以及动态调用对象的功能称为反射机制

简而言之就是通过字符串来操作类方法

getattr

class Student():  school = 'Beijing'  obj = Student()print(getattr(obj,'school',None))# 获取对象中的属性 对象名,属性名字符串形式,没有的话返回值

hasattr

class Student():  school = 'Beijing'  obj = Student()print(hasattr(obj,'school'))# 判断对象中有没有该属性 有的话返回 True 没有返回False

setattr

class Student():  school = 'Beijing'    obj = Student()setattr(obj, 'x', 100)print(obj.__dict__)# 输出结果 {'x': 100}# 更改值

delattr

# delattr 函数用于删除属性# delattr(obj, 'x') 相等于 del obj.xclass Student():  school = 'Beijing'    obj = Student()delattr(Student,'school')

扩展(重要)

class Foo():  def func(self):    print('func')    obj = Fooprint(getattr(obj,'func'))  # ==><function Foo.func at 0x1016f1670> 得到一个函数内存地址# 那么我们加括号就可以执行这个内存地址getattr(obj,'func')()# 输出结果 func

异常处理

1、什么是异常

异常是程序发生错误时的信号,程序一旦出错就会抛出异常

2、为什么要处理异常

为了增强程序的健壮性,即便程序在运行过程中出错了,也不要终止程序,而是捕捉异常并处理:将出错信息记录到日志内

3、如何处理

错误的两大来源

3.1语法上的错误

if 1 >3	print('run')  # SyntaxError 语法错误 在程序运行前就改正

3.2逻辑上的错误

l = ['a','b']l[2]  # 取了一个不存在的索引

针对逻辑上的异常又分成两种处理方式

错误发生是可以预知的,那我们就可以用if判断来解决该问题

如果是不可预知的,那我们必须要用异常处理语法来解决

try:  
子代码块 
# 有可能会抛出异常的代码
except 异常类型1 as e:
pass
except 异常类型2 as e:  
pass
except Exception as e:  # 万能异常 
pass
...
else:
如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:  
不管有没有异常都会执行finally的子代码

需要注意的是 else 需要和 except 搭配使用
image

抛出异常

Python 使用 raise 语句抛出一个指定的异常。

raise语法格式如下:

raise [Exception [, args [, traceback]]]
# 如果x大于5就触发异常x = 10if x > 5:    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))

自定义异常

你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承

class Myexception(BaseException): 
	def __init__(self, msg):      
		self.msg = msg    
	def __str__(self):      
		return "异常信息:%s" % self.msgraise Myexception("出异常了")  # 再抛出异常
posted @ 2021-07-15 19:00  popopop  阅读(30)  评论(0)    收藏  举报