Python面向对象之继承(02)

Python面向对象之继承(02)

知识框架:

1.什么是继承

2.继承与抽象

3.继承与重用性
      
4.继承的更多说明

什么是继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

继承概念的实现方式主要有2类:实现继承、接口继承。

  1. 实现继承是指使用基类的属性和方法而无需额外编码的能力。

  2. 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)。

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

python中类的继承分为:单继承和多继承

#定义父类
class ParentClass1: 
    pass
 #定义父类
class ParentClass2:
    pass
#单继承基类是ParentClass1派生类是SubClass
class SubClass1(ParentClass1):
    pass
 #python支持多继承,用逗号分隔开多个继承的类
class SubClass2(ParentClass1,ParentClass2):
    pass


提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

继承与抽象

抽象即抽取类似或者说比较像的部分。是一种归类的方法。

             

                               

继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类。

继承与重用性

在开发程序的过程中,当父类的方法实现不能满足子类需求时 可以对方法进行重写。
1.覆盖父类的方法
在子类中定义一个和父类同名的方法并且实现
2.对父类的方法进行扩展
 在子类中重写父类的方法
 在需要的位置使用 super().父类方法

注意:
python2.0 中调用父类方法 父类名.方法(self)
python 3.0 中仍然保留 但是不推荐使用 ,一旦父类发生变化 方法调用位置的类名也需要修改。开发过程中,父类名和super()两种方式不要混用,如果当前子类名调用方法会形成递归调用出现死循环。

class Parent:  # 定义父类
    def myMethod(self):
        print
        '调用父类方法'

class Child(Parent):  # 定义子类
    def myMethod(self):
        print
        '调用子类方法'

c = Child()  # 子类实例
c.myMethod()  # 子类调用重写方法

具体案例:

class Animal:
    '''
    人和狗都是动物,所以创造一个Animal基类
    '''
   def __init__(self, name,aggressivity,life_value):
        self.name = name  
        self.aggressivity = aggressivity  
        self.life_value = life_value 

   def eat(self):
        print('%s is eating'%self.name)

class Dog(Animal):
    pass

class Person(Animal):
    pass

egg = Person('Ahab',10,1000)
ha2 = Dog('天霸',50,1000)
egg.eat()
ha2.eat()

继承的更多说明

在python中继承中的一些特点:

  • 1、如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。

  • 2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数

  • 3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:

class SubClassName (ParentClass1[,
                 ParentClass2, ...]):
    ...

私有属性和方法 2.0

class A:
    def __init__(self):
        self.num1=100
        self.__num2=200
   def __test(self):
     print("私有方法%d%d"%(self.num1,
                        self.__num2))

class B(A):
    def demo(self):
子类对象方法中不能访问父类私有属性方法
AttributeError: 'B' object has 
            no attribute '_B__num2'
    print("访问父类私有属性%d"%self.__num2)
      self.__test

#创建一个子类对象
b=B()
print(b)  
<__main__.B object at 0x000000000266B1D0>
#在外界不能直接访问对象的
        私有属性调用私有方法
#print(b.__num2)  
<__main__.B object at 0x000000000266B1D0>
b.demo()

子类对象 不能在自己的方法内部直接访问父类的私有属性或私有方法
子类对象 可以通过父类的公有方法间接访问到 私有属性或 私有方法

继承有两种用途:

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)  

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

写在最后

今天只是简单的说了一下继承,继承的知识点非常多,后续会补充python的接口类和抽象类等相关知识,希望大家继续关注。

文章首发自公众号【Ahab杂货铺】关注公众号技术分享第一时间送达!

猜你喜欢

转载自blog.csdn.net/sinat_34576567/article/details/84246381