官网原文链接:
https://docs.python.org/3/tutorial/classes.html#a-word-about-names-and-objects
面向对象的三大特性:继承,封装,多态
多继承需要注意的点:
1、Python的类可以继承多个类,Java和C#中则只能继承一个类
2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先
当类是经典类时,多继承情况下,会按照深度优先方式查找
当类是新式类时,多继承情况下,会按照广度优先方式查找
经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。
经典类多继承
class D:
def bar(self):
print 'D.bar'
class C(D):
def bar(self):
print 'C.bar'
class B(D):
def bar(self):
print 'B.bar'
class A(B, C):
def bar(self):
print 'A.bar'
a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
新式类多继承
class D(object):
def bar(self):
print 'D.bar'
class C(D):
def bar(self):
print 'C.bar'
class B(D):
def bar(self):
print 'B.bar'
class A(B, C):
def bar(self):
print 'A.bar'
a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
解释:
经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
面向对象的应用:
所以,一般在Python开发中,全部使用面向对象 或 面向对象和函数式混合使用。
组合
软件重用的重要方式除了继承之外还有另外一种方式,即:组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
class Equip(object):
def fire(self):
print('release Fire skill')
class Riven:
camp = "Noxus"
def __init__(self,nickname):
self.nickname = nickname
self.equip = Equip() ##Riven类的对象调用该方法时,将会产生一个Equip对象
r1 = Riven('瑞雯雯')
r1.equip.fire() #release Fire skill
组合与继承的区别:
1、继承是建立了派生类与基类间的关系,它是一种‘是’的关系,比如人是动物。
2、组合是建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教师有生日,教师教Python和Linux课程。
抽象类
与Java一样,Python也有抽象类的概念,但是同样需要模块实现,抽象类是一个特殊的类,他的特殊之处在于只能被继承,不能被实例化。
from abc import ABCMeta,abstractclassmethod
class Foo(metaclass=ABCMeta): ##不能被实例化,只能被继承
@abstractclassmethod
def method1(self):
pass
class Bar(Foo):
def method1(self): ###必须要实现父类Foo的方法method1
print('.....')
Bar().method1()
#######################类中的方法########################
class A(object):
def __init__(self):
pass
def func(self):
return self
print(A().func) # <bound method A.func of <__main__.A object at 0x00000228952372E8>>
print(A().func()) # None
print(A.func) # <function A.func at 0x000001B56FE9FA60>
print(A.func(A())) # None