继承:
1.什么是继承?
-继承指的是新建类的方法,新建的类称之为字类或者派生类
-子类继承的类叫做父类,也称之为基类或超类
#集成的特征:
--字类可以继承父类的所有的属性(类所拥有的特征和技能),并且可以派生出自己的属性。
--注意: 在python3中,一个子类可以继承多个父类,其他语言只能一个子类继承一个父类
2.为什么要继承??
--目的: 为了减少代码的冗余(减少重复代码)
3.如何实现继承?
1.首先要确定谁是子类,谁是父类
2.在定义类时,字类 + () 内写入父类,即可实现继承
class Parent1:
pass
class Parent2:
pass
class Sub1(Parent1,Parent2):
pass
使用__bases__方法可以获取对象继承的类,以元组的形式返回。
print(Sub1.__bases__)
#__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)
在Python3
中如果一个类没有继承任何类,则默认继承object类
在Python2
中如果一个类没有继承任何类,不会继承object类
类的分类:
--新式类:继承了object的类以及该类的子类,python3
中所有的类都市新式类
--经典类: 没有继承object的类以及该类的子类,只有python2
中才有经典类
寻找继承关系:
--先抽象,再继承
抽象: 抽取相似的部分(属性),划分类别
继承: 继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构,一系列类相同的特征与技能的结合体
继承的关系: 即类与类的关系,子类与父类是从属关系
查找顺序:
1.先找对象本身
2.对象的类,没有则往下找
3.找父类-。。。--》object-->type
#查找:
mro() -->python内置函数,查看当前的继承顺序,在多继承的情况下
对象.mro()
菱形继承:(钻石继承) ---》多继承--》继承顺序
经典类 :深度优先
新式类 : 广度优先
#属性查找练习
class Foo:
def f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2')
self.f1()
class Bar(Foo):
def f1(self):
print('Bar.f1')
obj = Bar()
obj.f2()
Foo.f2
Bar.f1
派生:
子类中新定义的属性的这个过程叫做派生,子类在使用派生的属性时始终以自己的为准。
#方法一:
class OldboyPeople:
school ='oldboy'
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
class OldboyStudent(OldboyPeople):
def choose_course(self):
print(f'{self.name})
class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,gender,level):
OldboyPeople.__init__(self,name,age,gender)
self.level = level
def score(self,stu_obj,num):
print(f'{self.name})
stu1 = OldboyStudent('lise',17,'famle')
tea1 = OldboyTeacher('nick',18,male,9)
派生方法二(super):
1.严格依赖继承属性查找关系
2.super()
会得到一个特殊的对象,该对象就是专门用来访问父类中属性(按照继承的关系)
3.super().__init__
(参数)
4.super
的完整用法是super(自己的类名,self),在python2
中需要写完整,而python3
中可以简写为super()
lass OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class OldboyStudent(OldboyPeople):
def __init__(self, name, age, sex, stu_id):
super().__init__(name, age, sex)
self.stu_id = stu_id
def choose_course(self):
print('%s is choosing course' % self.name)
stu1 = OldboyStudent('tank', 19, 'male', 1)
注意: 两种方法不要同时使用!!
#通过继承实现修改json模块数据类型:
import json
from datetime import *
print(json.JSONEncoder) #类
print(datetime.today()) #时间
print(date.today()) # 日期
dict1 = {
'name':'tank',
'today1': datetime.today(),
'today2': date.today()
}
class MyJson(json.JSONEncoder):
def default(self,o):
#判断o是否式datetime的一个实例
if isinstance(o,datetime):
return o.strftime('%Y-%m-%d %X')
elif isinstance(o,o,date):
return o.strftime('%Y-%m-%d')
else:
return super().default(self,o)
res = json.dumps(dict1,cls = MyJson) # cls=None,默认指向的是原json的JSONEncoder
print(res)
# isinstance:
# python内置的函数,可以传两个参数,判断参数一是否式参数二的一个实例.