5

Python基础之面向对象:3、继承与派生 - kngk

 1 year ago
source link: https://www.cnblogs.com/kangssssh/p/16855176.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、三大特征之继承

  • python三大特征:

    • 封装、继承、多态
  • 三者中继承最为核心,实际应用多,感受较为直观

  • 封装和多态略微抽象

image

1、继承的概念

继承的含义:

​ 在现实生活中,继承表示人与人之间资源的从属关系

​ 例如:儿子继承父亲

​ 在编程的世界中,继承表示类与类之间的资源从属关系

​ 例如:类a继承类b

继承的目的:

​ 在现实生活中,儿子继承了附件就拥有了父亲所有资源的支配权限

​ 在编程世界中,类A继承了类B就拥有了类B中所有的数据和方法使用权限

2、继承的本质

​ 继承本质应该分为两部分:

​ 当多个类中含有相同部分时,我们就把相同的部分抽离出去,将相同的部分新成一个新的类,在用刚才被抽离出去相同部分的类,去继承新的那部分,这样的好处就是,当多个类需要一个相同用的功能时,可以节省代码,不用反复编写

​ 抽象:将多个类相同的东西抽出去,形成一个新的类

​ 继承:将多个类继承刚刚抽取出来的新的类

对象>>>:数据与功能的结合体

类(子类)>>>:多个对象相同功能和数据的结合体

父类>>>:多个子类相同功能和数据的结合体


本质:类、父类的本质都是为了节省代码,减少重复编写相同代码的时间,使用时更为方便

image

3、继承的实操

  • 在定义类的时候,类名后方可加括号,早括号内填入其他它类的名字,就意味着继承了其它类

  • python支持多类继承,括号内可填写多个类名,只需用逗号隔开即可

# 1、定义两个类,其中一个假设为父类,另一个假设为子类
class Father: 
    money = 99999999
    house = '老北京四合院'  # 父类中数据强大

class Son:
    pass  # 子类中空空如也


# 2、父类中的数据,子类无权直接使用,当我们在子类中继承父类后,子类和子类产生的对象都可以通过'点'的方式使用父类中的数据
class Father:
    money = 99999999
    house = '老北京四合院'


class Son(Father):
    pass

# 子类直接使用父类中的数据
print(Son.money)
# 子类产生的对象使用父类中的数据
obj1 = Son()
print(obj1.money)
------------------------------------------------------------------------------------
99999999
99999999

4、继承后名字查找的顺序

未继承:

​ 对象(object)自身名称空间>>>类的名称空间

单线继承:

​ 对象(object)自身名称空间>>>子类的名称空间>>>父类的名称空间

多线继承:

​ 1、菱形继承: (广度优先,最后才会找闭环的定点)

​ 对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)>>>闭环

​ 2、非菱形继承: (深度优先)

​ 对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)

	在一个子类绑定多个父类时,名字的查找顺序可能比较难理解,针对这个问题,可以使用python中内置方法:mor()   
	通过对象名点mor() 的方式,可以帮助我们查看名字的查找顺序
image

5、经典类与新式类

经典类:

​ 不继承object的类或者其子类的类

新式类:

​ 继承object或者其之类的类

​ 在python3中,只有新式类,所有类都默认继承object

​ 在python2中,区分经典类和新式类

在以后我们定义类的时候,如果没有明确的父类,可以在类的括号内填入object,这样话能够提高我们代码的兼容性

1、派生的概念

​ 派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法

2、派生的方法

1.直接引用父类的__ init __为其传参,并添加子类属性

​ 缺点:代码重复率太高,浪费资源,时间

class People:
    school = '清华大学'
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

class Teacher(People):
    def __init__(self, name, sex, age, title): #派生
        self.name = name
        self.sex = sex
        self.age = age
        self.title = title
    def teach(self):
        print(f'{self.name}是老师')

obj = Teacher('lili','female', 28, '高级教师') 
#只会找自己类中的__init__
print(obj.name, obj.sex, obj.age, obj.title)  
#lili female 28 高级教师

2.通过super()来只想父类的属性

​ super()是一个特殊的类,在子类__ init __内调用super得到一个对象,该对象指向父类的名称空间

class Teacher(People):
    def __init__(self, name, sex, age, title):
        super().__init__(name, age, sex)
        #调用的是绑定方法,自动传入self
        self.title = title
	 def teach(self):
         print(f'{self.name}是老师')
            
            
obj = Teacher('lili','female', 28, '高级教师') 

注意:在python2中super 的使用需要完整地写成super(自己的类名,self),而在python3中可以简写为super()。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK