python继承


继承是面向对象编程中的重要概念,也是类的三大特征之一。


面向对象编程中的“继承”概念是当对象C继承了对象A,C就有了对象A的所有属性和方法。通常C和A都是类,那么C就被称为“子类”,A被称为“父类”

>>> class A :
	a=1
	
>>> class C(A):
	pass

定义类A 其中只有一个类属性。然后定义类C。为了使C继承A,在C的名称后跟着“()”,其中写父类的名字

>>> dir(C)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a']

在子类C中没有写任何代码块。用dir(C)查看子类对象C的属性和方法,会发现父类的A 所定义的类属性也在其中。

>>> C.a
1

子类继承负累之后,不需要再次编写相同的代码,实现了代码重用的目的。另外子类继承父类的同时,也可以重新定义某些属性或方法。即用同名称的属性和方法覆盖父类的原油的对应部分,使其获得与父类不同的功能。
python中的继承可以分为‘’单继承‘’和‘’多继承‘’。

单继承

单继承就是只从一个父类那里继承。

 #__base__  属性可以得到当前的父类 C的父类是A
>>> C.__base__   
<class '__main__.A'>
#A的父类是object,所有类都是object的子类,python3中可以默认不写
>>> A.__base__
<class 'object'>

代码示例:
进一步理解“继承”——把父类的属性和方法都拿到了子类当中

class person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

class Student(person):
    def grade(self,n):
        print("{0} is grade is {1}".format(self.name,str(n)))

s = Student("xianyu",66)
s.grade(94)
print(s.get_name())
print(s.get_age())

多继承

对比单继承,多继承是一个子类继承了多个父类~,比如:

>>> class A1:
	a1=1

	
>>> class A2:
	a2=2

	
>>> class A3:
	a3=3

	
>>> class C(A1,A2,A3):
	pass

>>> dir(C)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a1', 'a2', 'a3']
>>> 

如果一个子类继承了多个父类,并且每个父类有相同的方法或者属性,那么实例化后,所调用的那个方法是哪一个父类呢?

继承顺序

#__mro__显示类的继承顺序
class A1:
    def foo(self):
        print("A1F")

class A2:
    def foo(self):
        print("A2F")
    def okk(self):
        print("ok")

class C1(A1,A2):
    pass
class C2(A1,A2):
    def okk(self):
        print("266ok")

class X(C1,C2):
    pass

print(X.__mro__)
m=X()
m.foo()

运行结果为

(<class '__main__.X'>, <class '__main__.C1'>, <class '__main__.C2'>, <class '__main__.A1'>, <class '__main__.A2'>, <class 'object'>)
A1F
266ok

采用“C3算法“”,有兴趣请参阅多继承查找规则

相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页