一、继承
- 继承的概念
在面向对象程序设计中,当我们定义一个类class
的时候,可以从某个现有的class
继承,新的class
称为子类(Subclass
),而被继承的class
称为基类、父类或超类(Base class、Super class
)。
语法形式:
class new_class_name( base_class_1,base_class_2,…. ):
pass
例如:
class Animal(object):
def run(self):
print('animal is running ...')
# Dog继承Animal,子类获得了父类的全部功能
class Dog (Animal):
pass
class Cat(Animal):
pass
- 继承的好处
1、通过父类派生出子类,子类获得了父类的全部功能。子类继承父类任何属性,包括数据属性和方法属性。
2、除了继承父类的全部功能,还可以覆盖父类的功能,或者定制只属于自己的特定功能。
如上例子,Animal
实现了run()
方法。因此,Dog
、Cat
作为其子类,自动获得了run()
方法。
尝试运行下代码:
>>> dog = Dog()
>>> dog.run()
animal is running ...
>>> cat = Cat()
>>> cat.run()
animal is running ...
二、多态
针对上述第2点,通过继承覆盖,可以给子类单独增加或者修改一些方法。
class Animal(object):
def run(self):
print('animal is running ...')
# Dog继承Animal,子类获得了父类的全部功能
class Dog (Animal):
# 多态,子类的方法覆盖了父类的方法
def run(self):
print('dog is running...')
def eat(self):
print('eating meat')
class Cat(Animal):
def run(self):
print('cat is running ... ')
在子类中,分别重新修改了run()
方法的实现,这种可以成为“多态”。
- 类与数据类型
当我们定义 了一个类,实际上也就定义了一种数据类型,与list、dict、string没有差别。例如:
a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型
我们可以通过isinstance()
来判断他们的类型:
>>> isinstance(a, list)
True
>>> isinstance(b, Animal)
True
>>> isinstance(c, Animal)
True # 此处c不仅仅是Dog类型,还是Animal类型。
>>> isinstance(b, Dog)
False
可以发现,c对象不仅仅是Dog类型,还是Animal类型(Dog的父类)。但是反过来,Animal不是Dog类型。
即在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,如果一个实例的数据类型是父类,不可以被看做是子类。
尝试如下运行:
dog = Dog()
dog.run()
cat = Cat()
cat.run()
结果就是:
dog is running...
cat is running...
在上述中,传入dog和cat都是Animal类型,由于Animal类型有run()
方法,因此,只要传入的类型是Animal类或者子类,就会自动调用实际类型的run()
方法,无需确切地知道它的子类型。但是具体调用的run()方法是作用在哪个对象上(具体调用哪个类的run()方法),由运行时该对象的确切类型决定。
Dog类对run()方法进行了重写,则dog对象调用的是自身类里的run()方法,同理cat对象。
❤ thanks for watching, keep on updating...
点个赞再走吧
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。