埃尔法哥哥:Python编程教程:面向对象之高级特性( 四 )
Father.__init__(self, name)
self.age = age
# 子类中覆写了父类的方法
def speak(self):
Father.speak(self)
print("我是子类的 speak 方法" + self.name + " 年龄:" + str(self.age))
s = Son("李四", 20)
s.speak()
3.4.3关于super
在Python中super是一个特殊的类(Python 3.x以后出现)
super()就是使用super类创建出来的对象
最常使用的场景就是在重写父类方法时 , 调用在父类中封装的方法实现
3.5、父类的私有属性和方法
子类对象不能在自己的方法内部 , 直接访问父类的私有属性或私有方法
子类对象可以通过父类的共有方法间接访问到私有属性或私有方法
私有属性和方法是对象的隐私 , 不对外公开 , 外界以及子类都不能直接访问
私有属性和方法通常用于做一些内部的事情
3.6、多继承3.6.1多继承的概念
多继承:子类可以拥有多个父类 , 并且具有所有父类的属性和方法
? 比如:孩子会继承自己的父亲和母亲的特性
本文插图
3.6.2多继承的语法
class 子类名(父类名1, 父类名2...):
pass
示例代码:
# 父类A
class A:
def test1(self):
print("A类中的test1方法 。。 ")
# 父类B
class B:
def test2(self):
print("B类中的test2方法 。。 ")
# 子类C同时继承A和B
class C(A,B):
pass
# 创建C对象
c1 = C()
c1.test1()
c1.test2()
3.6.3多继承的注意事项
提问:如果不同的父类中存在同名的方法 , 子类对象在调用方法时 , 会调用哪一个父类中的方法呢?
开发时 , 应该尽量避免这种容易产生混淆的情况 。 如果父类之间存在同名的属性或者方法 , 应该尽量避免使用多继承
3.6.4 Python中的 MRO (方法搜索顺序)[扩展]
python中针对类提供了一个内置属性, ___mro__ 可以查看方法搜索顺序
MRO是method resolution order , 主要用于在多继承时判断方法 , 属性的调用路径
print(C.__mro__)
输出结果:
( , , , )
在搜索方法时 , 是按照__mro_-的输出结果从左至右的顺序查找
如果当前类中找到方法 , 就直接执行 , 不再搜索
如果没有找到 , 就查找下一个类中是否有对应的方法 , 如果找到 , 就直接执行 , 不再搜索
如果找到最后一个雷 , 还没有对应的方法 , 程序报错
3.6.5 python 中的上帝类型
python 中有个类比较特殊, 所有的类都直接和间接的继承自这个类.
这个类就是: object . 他是所有类的基类 .
如果一个类没有显示的去继承一个类, 则这个类默认就继承 object , 也可以去显示的继承这个类.
class Student(object):
pass
3.6.6 新式类和旧式(经典)类[扩展]
object 是python为所有对象提供的基类 , 提供有一些内置的属性和方法 , 可以使用
dir 函数查看
新式类:以object为基类的类 , 推荐使用
经典类:不以object为基类的类 , 不推荐使用
在python 3.x中定义类时 , 如果没有指定父类 , 会默认使用object作为该类的父类 。 所以python 3.x中定义的类都是新式类
在python 2.x中定义类时 , 如果没有指定父类 , 则不会以object作为父类新式类和经典类在多继承时 , 会影响到方法的搜索顺序
提示:为了保证编写的代码能够同时在python 2.x 和python 3.x 运行 , 在定义类的时候 , 如果没有父类 , 建议统一继承自object
class 类名(object):
pass
推荐阅读
- 「」儿童节就送阿尔法蛋学习手表,安全贴心又能学习
- -悟空哥哥-618年中大促力来袭,iQOO Neo3应该是你不容错过的5G手机
- 埃尔法哥哥面对用户需求与AI技术之间的不平衡,AI产品经理该如何做?
- 埃尔法哥哥谁说机器学习难?它在这朵云上就没有门槛
- 埃尔法哥哥Python基础语法之“数据应用”
- 埃尔法哥哥Bionumerics软件的多位点VNTR分析
- 埃尔法哥哥一个例子就能读懂大数据,原来数据分析能在这些行业里使用
- 埃尔法哥哥C++程序员的职业生涯规划
- 埃尔法哥哥MAML-Tracker:用目标检测思路做目标跟踪?小样本即可得高准确率丨CVPR 2020
- 埃尔法哥哥数据规范之代码表