day_20
回顾
面向对象编程
核心是‘对象’, 对象指的是特征与技能的结合体
基于该编程思想鞋程序,就好比在创造世界,一种上帝式的思维方式
类
类是一系列对象相同的特征与技能的结合体
定义类是发生的事情:
- 会产生一个空的名称空间
- 会把类内部所有名字扔进名称空间
- 会执行类内部的代码
调用类时发生的事情:
- 会产生一个空的对象
- 会自动触发
__init__
- 会将对象与括号内的参数一同传给
__init__
注意:调用类的过程称之为类的实例化,产生的对象称之为类的一个实例
__init_
:在类内部创建的,会在调用类时触发该方法
对象的绑定方法特殊之处
-
由类来调用类内部的函数,该函数只是一个普通的函数, 函数需要接收几个参数就得传几个.
-
由对象来调用类内部的函数,该函数称之为对象的绑定方法, 会将不同的对象绑定给不同的方法,特殊之处是会将对象当作第一个参数传给该方法.
一切皆对象
在python中,一切皆对象. 指的是通过 type()查看,若返回的是
今日内容
面向对象阶段最重要的知识点:
三大特性:
- 继承
- 封装
- 多态
继承
什么是继承
继承指的是新建类的方法,新建的类称之为子类或者派生类,子类继承的类叫父类,也称之为基类或超类
继承的特征
子类可以继承父类的属性,并且可以派生出自己的属性
在python中,一个子类可以继承多个父类,其他语言只能一个子类继承一个父类
为什么要继承
继承的目的是为了减少代码冗余
如何实现继承
- 首先要确定好谁是子类,谁是父类
- 在定义类时,子类+(),()内些父类,实现继承
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)