面向对象的三大特征:封装、继承、多态。
封装
封装是面向对象编程的一大特点,将属性和方法放到类的内部,通过对象访问属性或者方法,隐藏功能的实现细节,也可以设置访问权限。
class Student():
def __init__(self,name,age):
self.name = name # 将属性封装到类的内部
self.age = age
def prin_info(self):
print(self.name,self.age)
# 在同一个类创建多个对象之间,属性是互不干扰的
zs = Student('张三', 20)
ls = Student('李四',21)
zs.prin_info()
ls.prin_info()
继承(重点)
继承是一种创建新类的方式,如果子类需要复用父类的属性或者方法时,就可以使用继承。当然,子类也可以提供自己的属性和方法。
父类中已经有的方法,在子类中直接继承,不用再重写。避免重复造轮子,减少代码的冗余。
class Father(): # 父类 超类
pass
class Son(Father): # 子类 派生类
pass
注意:在 python 中,新建的类可以继承一个或多个父类
继承作用:避免重复造轮子,减少代码的冗余
新式类与经典类
在 Python2 当中类分为新式类和经典类,如果有继承父类 object 则是新式类,否则为经典类。
class Test(): # 在python2中,经典类
pass
class Test1(object): #继承了object,在python2中,新式类
pass
Test()
Test1()
但是在 Python3 当中,全部都是新式类,默认继承 object
练习:验证 Python3 中,全部都是新式类
实现思路:比较继承与无继承两个空类的成员是否一致
拓展方法:对象.dir() 查看对象的属性与方法
class Test(): # 在python2中,经典类
pass
class Test1(object): #继承了object,在python2中,新式类
pass
d1 = Test()
d2 = Test1()
print(len(d1.__dir__()),d1.__dir__()) # 26个,两者方法完全一致
print(len(d2.__dir__()),d2.__dir__()) # 26个,两者方法完全一致
在object类中有很多的魔法方法,如init、str等等,创建的类直接继承了object类,可以使用object所有的方法。
单继承
从继承几个父类来划分,可以分为单继承和多继承
子类继承父类,则可以直接享受父类中已经封装好的方法
练习:用代码实现如下
实现代码如下
class Grandfather(object):
def sleep(self):
print('Grandfather sleep 11')
class Father(Grandfather):
def eat(self):
print('Father eat')
def drink(self):
print('Father drink')
class Son(Father):
def study_python(self):
print('Son study_python')
def sleep(self):
print('Son sleep 8') # 当子类中有与父类名字相同的方法,就意味着对父类方法进行了重写
T = Son()
T.study_python() # 自己的方法可以直接使用
T.eat() # 通过子类的对象可以使用父类的方法, 子类中没有的,可以从父类中找
T.sleep() # 子类中有就使用子类的方法;子类没有,去父类中找,父类中没有,则继续去父类的父类中去找
当对象调用方法时,查找顺序先从自身类找,如果自身没找到,则去父类找,父类无,再到父类的父类找,直到object类,若还无,则报错。这也称为深度优先机制。
需要注意的是,当子类与父类拥有同名称的方法时,子类对象调用该方法优先执行自身的方法。那么实际上就是子类的方法覆盖父类的方法,也称为重写。
但是实际的开发中,遵循开放封闭原则。我们并不会完全的重写父类的方法,而是希望同时实现父类的功能。这时,我们就需要调用父类的方法了,可以通过 super()函数实现。
super()
super(type[, object-or-type]) 函数是用于调用父类(超类)的一个方法
type --> 类
object-or-type --> 对象或类,一般是 self
练习:继以上练习实现,在Son的sleep方法当中,调用父类的sleep方法。
class Grandfather(object):
def sleep(self):
print('Grandfather sleep 11')
class Father(Grandfather):
pass
class Son(Father):
def study_python<