Python中的继承和组合
先决条件Python中的类和对象
本文将比较并重点介绍Python中is-a 关系和has-a 关系的特点。
什么是继承(Is-A 关系)?
这是一个面向对象的概念 编程。继承是一种允许我们从另一个类继承所有属性的机制。利用属性和功能的类称为父类(也称为基类) 。使用另一个类的属性的类称为子类(也称为派生类) 。继承也称为Is-A Relation 。
在上图中,类表示为框。继承关系由一个从Derived Class(Child Class)指向Base Class(Parent Class)的箭头表示。 extends 关键字表示子类是从父类继承或派生的。
句法 :
# Parent class
class Parent :
# Constructor
# Variables of Parent class
# Methods
...
...
# Child class inheriting Parent class
class Child(Parent) :
# constructor of child class
# variables of child class
# methods of child class
...
...
例子 :
Python3
# parent class
class Parent:
# parent class method
def m1(self):
print('Parent Class Method called...')
# child class inheriting parent class
class Child(Parent):
# child class constructor
def __init__(self):
print('Child Class object created...')
# child class method
def m2(self):
print('Child Class Method called...')
# creating object of child class
obj = Child()
# calling parent class m1() method
obj.m1()
# calling child class m2() method
obj.m2()
Python3
class Component:
# composite class constructor
def __init__(self):
print('Component class object created...')
# composite class instance method
def m1(self):
print('Component class m1() method executed...')
class Composite:
# composite class constructor
def __init__(self):
# creating object of component class
self.obj1 = Component()
print('Composite class object also created...')
# composite class instance method
def m2(self):
print('Composite class m2() method executed...')
# calling m1() method of component class
self.obj1.m1()
# creating object of composite class
obj2 = Composite()
# calling m2() method of composite class
obj2.m2()
Child Class object created...
Parent Class Method called...
Child Class Method called...
什么是组合(具有-A 关系)?
它是面向对象的基本概念之一 编程。在这个概念中,我们将引用其他类的一个或多个对象的类描述为实例变量。在这里,通过使用类名或创建对象,我们可以访问另一个类中的一个类的成员。它可以通过组合不同类的对象来创建复杂类型。这意味着一个类 Composite 可以包含另一个类 Component 的对象。这种类型的关系称为Has-A Relation 。
在上图中,类表示为带有类名Composite和Component的框,表示它们之间的 Has-A 关系。
class A :
# variables of class A
# methods of class A
...
...
class B :
# by using "obj" we can access member's of class A.
obj = A()
# variables of class B
# methods of class B
...
...
例子 :
蟒蛇3
class Component:
# composite class constructor
def __init__(self):
print('Component class object created...')
# composite class instance method
def m1(self):
print('Component class m1() method executed...')
class Composite:
# composite class constructor
def __init__(self):
# creating object of component class
self.obj1 = Component()
print('Composite class object also created...')
# composite class instance method
def m2(self):
print('Composite class m2() method executed...')
# calling m1() method of component class
self.obj1.m1()
# creating object of composite class
obj2 = Composite()
# calling m2() method of composite class
obj2.m2()
Component class object created...
Composite class object also created...
Composite class m2() method executed...
Component class m1() method executed...
解释:
- 在上面的例子中,我们创建了两个类Composite和Component来展示它们之间的Has-A 关系。
- 在Component 类中,我们有一个构造函数和一个实例方法m1() 。
- 类似地,在Composite class中,我们有一个构造函数,我们在其中创建了Component Class 的对象。每当我们创建Composite Class的对象时, 组件类是 自动创建。
- 现在在Composite 类的m2()方法中,我们使用实例变量obj1调用组件类的m1()方法,其中存储了组件类的引用。
- 现在,每当我们调用复合类的m2()方法时,都会自动调用组件类的m1()方法。
组合与继承
大多数人都非常困惑,这两个概念都指向代码可重用性,那么b/w 继承和组合以及何时使用继承和何时使用组合有什么区别?
继承用于类想要派生父类的性质,然后修改或扩展它的功能。继承将使用额外的功能扩展功能,允许覆盖方法,但在Composition的情况下,我们只能使用该类,我们不能修改或扩展它的功能。它不会提供额外的功能。因此,当需要不加任何修改地使用该类时,建议使用组合;当需要更改另一个类中方法的行为时,建议使用继承。