这是我参与11月更文挑战的18天,活动详情查看:2021最后一次更文挑战。
面向对象三大特性
面向对象的三大特性是指:
封装继承多态
封装
封装是面向对象编程的一大特点,将属性和方法放到类的内部,通过对象访问属性或者方法,隐藏功能的实现细节,也可以设置访问权限。
class Student:
def __init__(self,name,age):
self.name = name # 字段封装到了类的内部
self.age = age
def prin_info(self):
# print(ls.name,ls.age)
print(self.name,self.age)
ls = Student("李四",18)
# ls.name = "李四" # 字段(属性)定义在类的外部
# ls.age = 18
ls.prin_info()
继承
继承是一种创建新类的方式,如果子类需要复用父类的属性或者方法时,就可以使用继承。当然,子类也可以提供自己的属性和方法。
class Father: # 父类 超类
pass
class Son(Father): # 子类 派生类
pass
⚠️注意:在python中,新建的类可以继承一个或多个父类。
新式类与经典类
在Python2当中类分为新式类和经典类,如果有继承父类object则是新式类,否则为经典类。
但是在Python3当中,全部都是新式类,默认继承object。
通过比较继承与无继承两个空类的成员是否一致来验证Python3中,全部都是新式类,比较继承与无继承两个空类的成员是否一致:
对象.__dir__():查看对象的属性与方法
class Father(object):
pass
class Son:
pass
f = Father()
s = Son()
print(len(f.__dir__())) # 26
print(len(s.__dir__())) # 26
单继承
子类继承父类,则可以直接享受父类中已经封装好的方法:
class GrandFather(object):
def sleep(self):
print("GrandFather sleep")
class Father(GrandFather):
def eat(self):
print("Father eat")
def drink(self):
print("Father drink")
class Son(Father):
def study_py(self):
print("Son stupy python")
s = Son()
s.study_py()
s.eat()
s.sleep()
当对象调用方法时,查找顺序先从自身类找,如果自身没找到,则去父类找,父类无,再到父类的父类找,直到object类,若还无,则报错。这也称为深度优先机制。
但是需要注意的是,当子类与父类拥有同名称的方法时,子类对象调用该方法优先执行自身的方法。那么实际上就是子类的方法覆盖父类的方法,也称为重写:
class GrandFather(object):
def sleep(self):
print("GrandFather sleep")
class Father(GrandFather):
def eat(self):
print("Father eat")
def drink(self):
print("Father drink")
class Son(Father):
def study_py(self):
print("Son stupy python")
def sleep(self):
print("Son sleep")
s = Son()
s.study_py()
s.eat()
s.sleep() # Son sleep
但是实际的开发中,遵循开放封闭原则。我们并不会完全的重写父类的方法,而是希望同时实现父类的功能。这时,我们就需要调用父类的方法了,可以通过super()函数实现。
super()
super()函数是用于调用父类(超类)的一个方法。语法:
super(type[, object-or-type])
type:类;object-or-type:类,一般是self。
总结
- 继承:深度优先。先从自己找,找不到则往父类找。
- 重写(防止执行父类中的方法)。
self永远是执行该方法的调用者。super(子类,self).父类中的方法(arg) 或者 父类名.父类中的方法(self,arg)。
⚠️注意:
__init__方法也会继承,同实例方法一致- 私有属性以及私有方法没有被继承