Python面向对象三大特性
封装
封装顾名思义就是:将内部实现包裹起来,对外透明,提供api接口进行调用的机制
含义:对外面隐藏对象的属性和方法,仅提供接口
作用:安全性(通过私有变量改变对外的使用),复用性好
# 封装示例
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Student(object):
def __init__(self, name, score):
# 属性仅前面有两个下划线代表私有变量,外部无法访问,因此我们定义了两个新的方法,
# 这样可以避免外部通过score乱改分数,仅当我们自己知道接口才可以修改
self.__name = name
self.__score = score
def info(self):
print('name: %s ; score: %d' % (self.__name,self.__score))
def getScore(self):
return self.__score
def setScore(self, score):
self.__score = score
stu = Student('Tom',99)
print('修改前分数:',stu.getScore())
stu.info()
stu.setScore(59)
print('修改后分数:',stu.getScore())
stu.info()
继承
继承:即一个派生类(derived class)继承父类(base class)的变量和方法。
面向对象编程有个好处就是代码复用,而其中一种方法就是通过继承机制。继承就是说定义的一个新类,继承现有的类,获得现有类的非私有属性、方法。提到个私有,就是上面提到的那个前面加两个下划线的那个东西,他在外部无法调用,继承他的子类也不能。被继承的那个类称为基类、父类或超类,子类也可以叫做派生类。
单继承
单继承: 子类只继承一个父类
- 子类继承父类可以使用父类的方法和属性
- 继承的好处:是子类可以复用父类的代码
class Person(object): # Person是object子类,
def __init__(self):
self.name = 'zs'
def show(self):
print('show')
# Teacher类继承于Person类
class Teacher(Person):
pass
# 继承的调用
teacher = Teacher()
teacher.name # zs
teacher.show() # show
多继承
# 多继承:相当于继承多个父类
class A(object):
def show(self):
print('A show')
class B(object):
def show_info(self):
print('B')
def show(self):
print("B show")
# 类C 继承于A,B同时可以使用A,B方法和属性
class C(A,B):
pass
# 如果多个父类中有相同的方法名,默认调用括号中前面的类
C().show() # A show
C().show_info() # B
print(C.mro()) # mro表示类的继承顺序
多态
多态:是指一种事物的多种形态,根据对象类型的不同以不同的方式进行处理。
不同的 子类对象调用 相同的 父类方法,产生 不同的 执行结果,可以增加代码的外部 调用灵活度,都继承了一个父类,并且 都重写的父类的方法,让不同的对象调用相同的方法,会产生不同结果
# 创建一个主类
class Animal(object):
# 添加属性name
def __init__(self, name):
self.name = name
def run(self):
pass
def animalRun(self):
self.run()
# 继承于Animal
class Cat(Animal):
def run(self):
print('cat is running')
# 继承于Animal
class Dog(Animal):
def run(self):
print('dog is running')
# 因为有name属性,所以必须传参
d = Dog('lllll')
c = Cat('pppppp')
# 主类调用方法,把对象传进去
Animal.animalRun(c) # cat is running
Animal.animalRun(d) # dog is running