Python知识二十五(组合,面向对象的内置函数,魔术方法,魔法,__开头__的方法,(反射掌握4个方法) 异常)

昨日内容回顾

继承

面向对象三大特征之一
三大特征:
	封装
    继承
	多态
# 继承:解决类与类之间的代码冗余问题

# 父类
class Admin():
    pass

class People():
    school = 'SH'
    
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        
   
# 子类
class Student(People,Admin):
    	pass
 
'''
	单继承的查找顺序:先在对象自己的名称空间中查找属性,产生对象的类中查找,在去继承的父类中查找
'''
stu = Student('ly', 19, 'male')
stu.school
    
 '''
 多继承的属性查找顺序:
 	1. 经典类:不继承object类的类以及子子孙孙类都是经典类
    2. 新式类:继承object类的类以及子子孙孙类都是新式类
    
    在python2 中才区分经典类和新式类
    
    在python3 中都是新式类,默认都继承了object类
    
 '''

经典类中属性查找顺序:按照深度优先查询
新式类中属性查找顺序:按照广度优先查询
    

super和mro列表

# 父类
class People():
    school = 'SH'
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
# 子类

class Student(People):
    def __init__(self, name, age, gender, course=None):
        if course is None:
            course = []
        self.course = course
        # People.__init__(self, name, age, gender)  # 类来调用方法,就是在电影普通方法,有几个参数就传递几个参数
        # super(Student, self) 返回的是一个特殊的对象
        # super(Student, self).__init__(name, age, gender) # python2中写法
        super().__init__(name, age, gender) 
        
 Student.mro()       
 

多态与多态性

# 多态是面向对象三大特征之一

什么是多态?
	一种事物的多种形态

多态中的类目的:不是用来继承父类的属性和方法的,让父类来限制子类的行为

import abc

# 此类已经变为抽象类,
# 抽象类只能被继承,不能被实例化
class Animal(meteclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        pass
 
class People(Animal):
    def speak(self):
        pass
class Pig(Animal):
	def speak(self):
        pass


class Dog(Animal):
	def speak(self):
        pass

obj = People()
obj.speak()



# python推荐鸭子类型
class People():
	def speak(self):
        pass

class Pig():
	def speak(self):
        pass

class Dog():
	def speak(self):
        pass
    
 obj1 = People()
 obj2 = Pig()
obj3 = Dog()

# obj1.speak()
# obj2.speak()
# obj3.speak()

def animal(animal):
    return animal.speak

animal(obj1)
animal(obj2)
animal(obj3)

# 父类限制子类的行为:
class Animal():
    def speak(self):
        raise Exception('必须实现speak')
 
class People(Animal):
    def speak(self):
        pass
   
        

今日内容概要

  • 组合
  • 面向对象的内置函数(魔术方法,魔法,__开头__的方法)
  • 反射(掌握4个方法)
  • 异常

今日内容详细

组合

# 组合:就是一个对象拥有一个属性,该属性的值是另外一个对象

解决类与类之间的代码冗余问题
	1. 继承:满足什么是什么的关系,is-a的关系
    2. 组合:
    
继承是一把双刃剑,并不是继承的越多,就越好

class People():
    school = 'SH'

    def __init__(self, name, age, gender, ):
        self.name = name
        self.age = age
        self.gender = gender


class Admin(People):
   pass


class Course():
    def __init__(self, name, period, price, ):
        self.name = name
        self.period = period
        self.price = price


python = Course('python', '6mon', 10000)
linux = Course('linux', '5mon', 20000)


class Student(People, Course):
    def __init__(self, name, age, gender, course=None):
        if course is None:
            course = []
        self.courses = course
        super().__init__(name, age, gender, )

    def choose_course(self, stu_obj, course):
        stu_obj.courses.append(course)
    

面向对象的内置函数

1. __init__()
2. __str__()
3. __del__()
4. __enter__()
5. __exit__()
6. __call__()

class Student():
    school = 'SH'

    # 调用类的时候触发
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def tell(self):
        print('name: %s, age: %s' % (self.name, self.age))

    # 打印对象的时候,自动触发的函数
    # 返回值只能是字符串
    def __str__(self):
        return 'name:%s' % self.name
        # return 123
        
       # 1. 手动执行del
    # 2. 程序执行完毕触发
    def __del__(self):
        print('__del__')
        self.f.close()
	
    
    # 对象加括号自动触发
    def __call__(self, *args, **kwargs):
        print('__call__')


stu = Student('ly', 20)

反射(掌握4个方法)

# 对象通过字符串来操作属性

1. getattr
print(getattr(stu, 'name1', None))  # stu.name
stu.func()
print(getattr(stu, 'func'))
getattr(stu, 'func')()  # 必须掌握

2. setattr
setattr(stu, 'x', 123)
print(stu.__dict__)

3. hasattr
print(hasattr(stu, 'name'))

4. delattr
delattr(stu, 'name')
print(stu.__dict__)

异常

1. 什么是异常?
	异常就是错误发生的信号,如果不对该信号做处理,那么异常之后的代码都不会执行
    
    异常的种类:
    	1. 语法错误
        	print(123
        2. 逻辑错误
             # 逻辑错误尽量写到完美
			a = [1, 2, 3]
             a[5]
2. 为什么要用异常
	增强代码的健壮性
                  
3. 怎么用异常?
        try:
              被监测代码
        except 异常的类型:
                  pass
          except 异常的类型:
                  pass
          except 异常的类型:
                  pass
        except Exception as e:
                  pass
        else:
              # 当被监测代码没有发生异常的时候,触发的
                  pass
        finally:
               不管被监测的代码有没有出错,都执行   
                  

作业

1. 整理今日内容到博客
2. 复习本周所有面向对象内容
3. 预习新课
posted @ 2021-12-07 11:52  弑悟  阅读(9)  评论(0)    收藏  举报