目录
继承
继承方法重写
多态
python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装、多态。
*封装(隐藏)
隐藏对象的属性和实现细节,只对外提供必要的方法,相当于将“细节封装起来”,只对外暴露“相关调用方法”。
通过“私有属性,私有方法“的方式,实现”封装”,python追求简洁的语法,没有严格的语法级别的“访问控制符”。
*继承
继承可以让子类具有父类的特性,提高代码的重用性。
从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新功能,或者改进已有的算法。
*多态
多态是指同一个方法调用由于对象不同会产生不同的行为,生活中这样的例子比比皆是:同样是休息,人不同休息的方法不同,有的休息是睡觉,有的休息是玩游戏等等。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
继承
继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。
如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低类工作难度,已有的类,称为“父类或者基类”,新的类,称为“子类或者派生类”。
语法格式:
python支持多重继承,一个子类可以继承多个父类,继承的语法格式如下:
class 子类类名(父类1[,父类2,....]):
类体
如果在类定义中没有指定父类,则默认父类是object类,也就是说,object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__();
定义子类时,必须在其他构造函数中调用父类的构造函数,调用格式如下:
父类名.__init__(self,参数列表)
- 多重继承
python支持多重继承,一个子类可以有多个”直接父类“。这样,就具备了“多个父类”的特点,但是由于,这样会被“类的整体层次”搞的异常复杂,尽量避免使用。查看类多重继承结构
继承方法重写
- 成员继承:子类继承父类除构造方法之外的所有成员。
- 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”
简单方法重写使用
# 测试继承方法重写的简单使用
class Person(object):
def __init__(self, name, age):
= name
self.__age = age
def say_age(self):
print("你是:{},年龄:{}".format(, self.__age))
class Student(Person):
def __init__(self, name, age, score):
Person.__init__(self, name, age) # 必须显示的调用父类初始化方法,不然解释器不会去调用
self.score = score
def say_age(self):
"""
重写了父类的方法
:return:
"""
print('我是:{},年龄:{}'.format(, self.score))
if __name__ == '__main__':
st = Student('张三', 13, 23)
print(dir(st)) # 查看对象的所有属性
st.say_age()
重写__str__()方法
object有一个__str__()方法,用于返回一个“对象的描述”,对应于内置函数str(),经常用于print()方法,帮助我查看对象的信息,__str__可以重写。
# 重写object类里面的__str__方法,此方法是返回一个对于"对象的描述"
class per: #默认继承object类
def __init__(self, name):
= name
def __str__(self):
return "对象是:{}".format()
if __name__ == '__main__':
p = per('张三')
print(p)
执行返回:
不重写__str__,返回:<__main__.per object at 0x7fbe2a2856a0>
重写__str__,返回:对象是:张三
super()获得父类定义
在子类中,想要获得父类的方法时,可以通过super()来做,
super()代表父类的定义,不是父类对象
# 测试super(),代表父类定义,而不是父类的对象
class a:
def say_age(self):
print('你好撒:', self)
class b(a):
def say_age(self):
# a.say_age(self) # 调父类的方法,这种在调用单继承的时候没有问题,
super().say_age() # 调用父类的方法,这种是解决多继承的问题
print('b是啥:', self)
b().say_age()
多态
多态是指同一个方法调用由于不同可能会产生不同的行为。
关于多态要注意一下两点:
1.多态是方法的多态,属性没有多态
2.多态的存在有2个必要条件:继承、方法重写
【例子】
# 多态
class Man:
def eat(self):
print('饿了,需要吃饭')
class Chinese(Man):
def eat(self):
print('中国人开始吃饭,筷子已备好')
class English(Man):
def eat(self):
print('英国人开始吃饭,刀叉已备好')
class Indian(Man):
def eat(self):
print('印度人开始吃饭,自备吧,我也不知道你用啥了')
def manEat(m):
if isinstance(m, Man): # m是否是Man的子类
m.eat()
else:
print('闲饿着吧,,还没有开饭')
manEat(Chinese())
manEat(English())
manEat(Indian())
执行返回