继承

目录

继承:

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内置的函数,可以传两个参数,判断参数一是否式参数二的一个实例.
原文地址:https://www.cnblogs.com/shaozheng/p/11648570.html