前言
今天开始,正式进行CSDN的撰写啦,内容都是按照学习和复习整理的顺序进行撰写的。
如果有撰写的不明确的地方 欢迎大家和我一起讨论。有好的建议也可以提出来哦!
一、面向对象的三大特性
- 封装根据职责将属性和方法 封装到一个抽象的类中
- 继承 ** 实现代码的重用**,相同的代码不需要重复的编写
- 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度
二、关于继承
1.如何同时执行类以及父类方法
方法一:如果想执行父类的func方法,这个方法并且子类中也用,那么就在子类的方法中写上:父类.func(对象,其他参数)
方法二:利用super,super().func(参数)
class Aniaml(object):
type_name = '动物类'
def __init__(self, name, sex, age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print('吃东西')
class Person(Aniaml):
def __init__(self, name, sex, age, mind):
super().__init__(name, sex, age)
# 这里使用方法二
self.mind = mind
# 通过父类名字加点加方法名的方式执行父类同名方法
def eat(self):
Aniaml.eat(111)
#这里使用方法一
print('%s 吃饭' % self.name)
class Cat(Aniaml):
pass
class Dog(Aniaml):
pass
p1 = Person('aaron', '男', 18, '想吃东西')
p1.eat()
print(p1.__dict__)
此处输出为:
2.多继承中的mro
对于Python中的多继承情况,运行时在搜索对象的属性或方法时,需要遵循一定的顺序规则,这个规则称为:Method Resolution Order (MRO).
下方为一多继承示例:
在经典类中采⽤的是深度优先,遍历⽅案. 什么是深度优先. 就是⼀条路走到头. 然后再回来. 继续找下⼀个.
类的MRO: Foo-> H -> G -> F -> E -> D -> B -> A -> C.(->object)
‘’‘python的新式多继承 最后都会继承到object 收尾 下图mro图未体现’‘’
代码如下:
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class E:
pass
class F(D, E):
pass
class G(F, D):
def func1(self):
print("func1 in G")
pass
class H:
def func1(self):
print("func1 in H")
pass
class Foo(H, G):
pass
print(Foo.mro())
#类名加mro()方法 返回list
print(Foo.__mro__)
#类名加__mro__ 返回tuple
f = Foo()
f.func1()
#可以通过mro方法 发现继承顺序为先H再G 因此在 f只运行H中的同名fuc1方法
运行结果如下,
同时 我们也可以注意到 最后的class 为object
是因为python的新式多继承 最后都会继承到object 收尾
总结
- 通过父类名字加点加方法名的方式执行父类同名方法
- 利用super,super().func(参数)方式执行父类同名方法
- 多继承 可以通过mro方法 获取继承顺序