python面向对象之封装,继承,多态
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。在python的类中,封装即通过__init__函数将数据赋给对应的变量进行保存,便于其他地方使用
所以,在使用面向对象的封装特性时,需要:
将内容封装到某处
从某处调用被封装的内容
class Car(object):
'Car'
def __init__(self, name, color, price):
self.name = name
self.color = color
self.price = price
def run(self):
print("%s的%s正在跑" % (self.color, self.name))
car = Car('大奔', '黑色', '80万')
car.run()
car2 = Car('法拉利', '红色', '1000万')
car2.run()
黑色的大奔正在跑
红色的法拉利正在跑
通过__init__构造函数给变量赋值,使成员函数可以使用初始化的变量。达到将数据的方法封装的目的。
继承。。。。
之前说过我们可以把狗抽象成一个类,那么,我们是不是也可以把猫抽象成一个类?再看,猫和狗是不是也具备一些相同的特征?
继承
比如,跑,叫,吃东西。。。那把这两者结合是不是还可以再抽象出一个新的类,比如说Animal这个类?
class Animal(object):
'Animal'
def __init__(self):
print("Animal 的__init__方法")
def run(self):
print("running")
def shout(self):
pass
class Dog(Animal): # 继承Animal
'Dog'
def __init__(self):
print("Dog 的__init__方法")
def shout(self):
print("汪汪汪")
class Cat(Animal): # 继承Animal
'Cat'
def shout(self):
print("喵喵喵")
dog = Dog()
cat = Cat()
运行结果如下
Dog 的__init__方法
Animal 的__init__方法
通过class 类名(要继承的类的类名)即可实现继承。可以发现,调用了两次__init__方法,但是在Cat类里面没有写__init__函数,那为什么会出现这样的情况呢?继承,因为Cat继承了Animal类,所以,会出现上面这种情况,虽然Dog类也继承了Animal类,但是在Dog类中我们定义了__init__函数,或者说是重写了__init__函数,因此,Dog类在实例化时不会调用父类的构造方法,而是执行自己的构造方法。那么如果我们自己不仅想重写构造函数而且还想要继承父类的构造函数,那如何让做呢?
第一种方式:父类名.__init__(self)
第二种方式:super(自己的类名,self).__init__()
def __init__(self):
print("Cat 的__init__方法")
# 第一种、调用超类的构造方法
Animal.__init__(self)
# 第二种、super函数返回一个super对象,解析过程自动查找所有的父类和父类的父类,当前类和对象可以作为super函数的参数使用,调用函数返回的方法是超类的方法。使用super函数如果子类继承多个父类只许一次继承,使用一次super函数即可。
super(Cat, self).__init__()