day_20

回顾

面向对象编程

核心是‘对象’, 对象指的是特征与技能的结合体

基于该编程思想鞋程序,就好比在创造世界,一种上帝式的思维方式

类是一系列对象相同的特征与技能的结合体

定义类是发生的事情:

  1. 会产生一个空的名称空间
  2. 会把类内部所有名字扔进名称空间
  3. 会执行类内部的代码

调用类时发生的事情:

  1. 会产生一个空的对象
  2. 会自动触发__init__
  3. 会将对象与括号内的参数一同传给__init__

注意:调用类的过程称之为类的实例化,产生的对象称之为类的一个实例

__init_:在类内部创建的,会在调用类时触发该方法

对象的绑定方法特殊之处

  1. 由类来调用类内部的函数,该函数只是一个普通的函数, 函数需要接收几个参数就得传几个.

  2. 由对象来调用类内部的函数,该函数称之为对象的绑定方法, 会将不同的对象绑定给不同的方法,特殊之处是会将对象当作第一个参数传给该方法.

一切皆对象

在python中,一切皆对象. 指的是通过 type()查看,若返回的是的都是对象. 例如: python的8大数据类型.

今日内容

面向对象阶段最重要的知识点:

三大特性:

  1. 继承
  2. 封装
  3. 多态

继承

什么是继承

继承指的是新建类的方法,新建的类称之为子类或者派生类,子类继承的类叫父类,也称之为基类或超类

继承的特征

子类可以继承父类的属性,并且可以派生出自己的属性

在python中,一个子类可以继承多个父类,其他语言只能一个子类继承一个父类

为什么要继承

继承的目的是为了减少代码冗余

如何实现继承

  1. 首先要确定好谁是子类,谁是父类
  2. 在定义类时,子类+(),()内些父类,实现继承
class foo:
    xxx=111
	pass
class soo(foo):
    pass

查看继承的父类

__bases__,是类的属性,用来查看当前类的父类

寻找继承关系

先抽象,再继承

什么是抽象

抽取相似的部分,称之为抽象

继承的关系

对象是特征与技能的结合体.类是一系列对象相同的特征与技能的结合体.继承是一系列类相同的特征与技能的结合体.

继承背景下对象属性查找顺序

对象的名称空间——类——父类

注意:对象查找属性,若子类有,不管父类 有没有,以子类的为准

查看对象名称空间

__class_:对象的属性,查看当前对象的类

派生

指的是子类继承父类的属性,并派生出新的属性

问题:子类继承父类的__init__毫无意义

解决方式:

方式一

直接通过父类.(调用)__init__,把__init__当做普通函数使用,传入对象与继承的属性。

方式二

super是一个特殊的类,在子类中调用super()会得到一个特殊的对象,通过“.”指向的是父类的名称空间

class OldboyPeople:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


#方式一:
class OldboyTeacher(OldboyPeople):
    # 等级, 薪资
    def __init__(self, name, age, sex, level, sal):
        OldboyPeople.__init__(self, name, age, sex)
        self.level = level
        self.sal = sal


class OldboyStudent(OldboyPeople):
    # 课程
    def __init__(self, name, age, sex, course):
        OldboyPeople.__init__(self, name, age, sex)
        self.course = course

    def choose_course(self):
        print(f'学生{self.name}选择课程{self.course}')
        
        
# 方式二:
class OldboyTeacher(OldboyPeople):
    # 等级, 薪资
    def __init__(self, name, age, sex, level, sal):
        super().__init__(name, age, sex)
        self.level = level
        self.sal = sal


class OldboyStudent(OldboyPeople):
    # 课程
    def __init__(self, name, age, sex, course):
        super().__init__(name, age, sex)
        self.course = course

    def choose_course(self):
        print(f'学生{self.name}选择课程{self.course}')

新式类与经典类

在python2中才有新式类与经典类之分

在python3中所有的类都是新式类

新式类:

继承object的类都称之为新式类

python3中子类默认继承object

经典类

在Python2中,凡是没有继承object的类都是经典类

mro():属于object——>type的函数,用来查看当前类的继承顺序,在多继承的情况下

钻石继承

在多继承的情况下形成的钻石继承(继承顺序)

  • 经典类:

    ​ 深度优先

  • 新式类

    ​ 广度优先

通过继承实现修改json模块数据类型

#开发者的角度: 直接转成str
dict1 = {
    'name': 'tank',
    'today': str(datetime.today()),
    'today2': str(date.today())
}

res = json.dumps(dict1)
print(res)

isinstance:

python内置的函数,可以传两个参数,判断参数一是否是参数二的一个实例

# 开源者的角度: 修改json源码
class MyJson(json.JSONEncoder):
    def default(self, o):

        # 子类派生的功能
        # 判断o是否式datetime的一个实例
        if isinstance(o, datetime):
            return o.strftime('%Y-%m-%d %X')
        elif isinstance(o, date):
            return o.strftime('%Y-%m-%d')
        else:
            # 继承父类的default方法的功能
            return super().default(self, o)


dict1 = {
    'name': 'tank',
    'today': datetime.today(),
    'today2': date.today()
}

res = json.dumps(dict1, cls=MyJson)  # cls=None,默认指向的是原json的JSONEncoder
print(res)
posted @ 2019-10-10 15:23  mqb11  阅读(105)  评论(0编辑  收藏  举报