📜  Python中的继承和组合

📅  最后修改于: 2022-05-13 01:55:06.941000             🧑  作者: Mango

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

组成 – 图解表示

在上图中,类表示为带有类名CompositeComponent的框,表示它们之间的 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...

解释:

  • 在上面的例子中,我们创建了两个类CompositeComponent来展示它们之间的Has-A 关系
  • Component 类中,我们有一个构造函数和一个实例方法m1()
  • 类似地,在Composite class中,我们有一个构造函数,我们在其中创建了Component Class 的对象。每当我们创建Composite Class的对象时, 组件类 自动创建。
  • 现在在Composite 类m2()方法中,我们使用实例变量obj1调用组件类m1()方法,其中存储了组件类的引用。
  • 现在,每当我们调用复合类m2()方法时,都会自动调用组件类m1()方法。

组合与继承

大多数人都非常困惑,这两个概念都指向代码可重用性,那么b/w 继承和组合以及何时使用继承和何时使用组合有什么区别?

继承用于类想要派生父类的性质,然后修改或扩展它的功能。继承将使用额外的功能扩展功能,允许覆盖方法,但在Composition的情况下,我们只能使用该类,我们不能修改或扩展它的功能。它不会提供额外的功能。因此,当需要不加任何修改地使用该类时,建议使用组合;当需要更改另一个类中方法的行为时,建议使用继承。