目录
概述
在我们创建类时,类名称旁边的小括号中,一般填写object(这并不是随便写的)。
Object类是所有类的父亲,还可称为基类或超类。
继承:有两个类,A类和B类,当我们说A类继承自B类时,
那么A类就拥有了B类中的所有属性和方法。
注意:继承者称为子类,被继承的类称为父类
继承的作用
- 简化了代码,减少冗余
- 提高代码的健壮性
- 提高了代码的安全性
- 是多态的前提
缺点
降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;
增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。
降低代码的灵活性。耦合与内聚是描述类与类之间的关系。耦合性越低内聚性越高代码越好。
单继承实现
设置person类
创建一个基类person类,设置拥有名称、年龄属性,并且有吃和跑两种行为。
示例如下:
class Person(object):
name = ''
age = 0
def __init__(self, name, age):
# 赋值
self.name = name
self.age = age
def eat(self, food):
print('开始吃%s' % food)
def run(self):
print('开始跑步')
创建子类学生类
创建student类继承person类
需要引入person类,在构造函数中使用super继承父类的init。
示例如下:
from Person import Person
class Student(Person):
def __init__(self, name, age):
# 调用父类的init方法 需要传递相应参数
super().__init__(name, age)
实例化student类
实例化学生类后,可以调用父类的方法。
示例如下:
from Student import Student
stu = Student('张三', 18)
stu.eat('果冻橙')
stu.run()
# 执行结果
# 开始吃果冻橙
# 开始跑步
创建worker子类
创建worker类继承person类
还是需要引入person类,在构造函数中使用super继承父类的init。
示例如下:
from Person import Person
class Worker(Person):
def __init__(self, name, age):
super().__init__(name, age)
实例化worker类
实例化worker类后,也去调用父类的方法。
只要是继承Person类的都可以调用父类设置的方法。
示例如下:
from Student import Student
from Worker import Worker
stu = Student('张三', 18)
stu.eat('果冻橙')
stu.run()
work = Worker('李四', 20)
work.eat('面条')
work.run()
子类独有属性
子类也可以在继承原有父类的基础上拥有自己独有的属性。
比如在学生类中增加该学生的成绩分数。
示例如下:
from Person import Person
class Student(Person):
def __init__(self, name, age, score):
# 调用父类的init方法 需要传递相应参数
super().__init__(name, age)
# 赋值分数
self.score = score
实例化时增加分数
示例如下:
from Student import Student
from Worker import Worker
stu = Student('张三', 18, 100)
stu.eat('果冻橙')
stu.run()
print(stu.score)
# 执行结果
# 开始吃果冻橙
# 开始跑步
# 100
父类私有属性
设置父类的私有属性,尝试子类是否能继承。
示例如下:
class Person(object):
name = ''
age = 0
# 私有属性
__money = 100
def __init__(self, name, age, money):
# 赋值
self.name = name
self.age = age
self.__money = money
print(self.__money)
def get_money(self):
return self.__money
def set_money(self, money):
if money <= 0:
money = 0
self.__money = money
子类构造函数修改
在Student类构造函数中增加money属性传递。
示例如下:
from Person import Person
class Student(Person):
def __init__(self, name, age, score, money):
# 调用父类的init方法 需要传递相应参数
super().__init__(name, age, money)
# 赋值分数
self.score = score
实例化子类
实例化学生类,并且调用set_money 和 get_money方法,执行后查看结果。
示例如下:
from Student import Student
stu = Student('张三', 18, 100, 1000)
stu.set_money(200)
print(stu.get_money())
# 执行结果
# 1000
# 200
通过查看结果可得出:子类没有继承父类的私有属性;
通过子类继承的公共方法访问私有属性,访问的是子类的私有属性,而不是父类的。
多继承实现
创建基类
创建父亲类
设置一个run和test类方法,在构造函数中赋值一个money属性。
示例如下:
class Father(object):
def __init__(self, money):
self.money = money
def run(self):
print('跑')
def test(self):
print('测试1')
创建母亲类
母亲类中有eat和test类方法,为了与父亲类做区别,在构造函数中赋值一个新的属性。
示例如下:
class Mother(object):
def __init__(self, new_value):
self.new_value = new_value
def eat(self, food):
print('吃%s' % food)
def test(self):
print('测试2')
创建子类
引入基类
将基类引入到当前子类的命名空间中。
示例如下:
from Father import Father
from Mother import Mother
创建子类并继承基类
创建子类并继承父类和母类,需要在构造函数中传递父类和母类构造函数需要的参数。
示例如下:
from Father import Father
from Mother import Mother
class Child(Father, Mother):
def __init__(self, money, new_value):
Father.__init__(self, money)
Mother.__init__(self, new_value)
调用继承类的方法
多继承类实例化并调用父类方法。
示例如下:
from Child import Child
if __name__ == '__main__':
child = Child(100, 200)
child.run()
child.eat('香蕉')
child.test()
执行结果:
跑
吃香蕉
测试1
通过执行结果可以发现继承的父类和母类中的方法都可以使用;
但是当父类和母类中方法名相同,默认调用的是在括号中排前面的父类中的方法。
总结
本篇为Python面向对象的继承概念和示例内容学习笔记。