. 继承
1. 单继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类.
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.
如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现
语法:
class 派生类名(基类名)
.............
子类以及子类实例化的对象,可以访问父类的任何方法或者变量
类名可以访问父类所有内容
子类的实例化对象也可以访问父类的所有内容
class Animal:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def eat(self,a1):
print('%s吃%s' % (self.name,a1))
def drink(self):
print('%s喝东西' % (self.name))
class Cat(Animal):
def miaow(self):
print('喵喵叫')
# def eat(self): # 若子类创建了和父类中相同的方法,只执行自己类中的方法
# print(666)
class Brid(Animal):
def __init__(self, name,sex,age,wing): # self b1对象 name '鹦鹉',sex '公',age 20, wing '绿翅膀'
'''
self=b1对象
name='鹦鹉'
sex='公'
age= 20,
wing='绿翅膀'
'''
# Animal.__init__(self, name, sex, age)
super().__init__(name,sex,age) # super(Brid,self).__init__(name,sex,age) 即想执行子类的方法,也想执行父类的方法
self.wing = wing
def bark (self):
print('嗷嗷叫')
def eat(self,argv):
super().eat(argv)
print('鸟吃虫子...')
class Chook(Animal):
def crow(self):
print('大爷laiwanya')
b1 = Brid('鹦鹉','公',20,'绿翅膀')
b1.eat('金蝉')
如果既想执行子类的方法,有想执行父类的方法,一共有两种方法:
1. 父类名.__方法名__(self,父类属性)
2. super().__方法名__(父类的属性)
2. 多继承
多继承的查询顺序以经典类或者新式类区分:
新式类:遵循广式优先查询 一条路走到倒数第二级,判断是否有其他路可以走到终点,如果有则返回走其他路,没有直接到终点
经典类:遵循深度优先查询 一条路走到终点
其中单继承中,经典类或者新式类的查询方式都是一样的
二. 封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容.
封装就是把类中的属性和方法定义为私有的,方法就是在属性名或方法名前加双下划线,而一旦这样定义了属性或方法名后,python会自动将其转换为_类名__属性名(方法名)的格式,在类的内部调用还是用双下划线加属性名或方法名,在类的外部调用就要用_类名__属性名(方法名)。父类的私有属性和方法,子类无法对其进行修改
所以,在使用面向对象的封装特性时,需要:
将内容封装到某处
从某处调用被封装的内容
# 广义的封装: 实例化一个对象,给对象空间封装一些属性.
# 狭义的封装: 私有制.
# 私有成员:私有静态字段,私有方法,私有对象属性
# 私有静态字段
class B:
__money = 100000
class A(B):
name = 'xxx'
__age = 1000
def func(self):
print(self.__age)
print(A.__age) # 对于私有静态字段,类的内部可以访问.
print('func....')
def func1(self):
print(self.__money)
print(A.__money)
a1 = A()
print(a1.name)
print(A.name)
print(a1.__age) # 通过实例化对象不能访问私有静态字段
print(A.__age) # 通过类名也不能访问私有静态字段
# 对于私有静态字段,类的外部不能访问.
总结:
对于私有静态字段,只有在本类内部才可以访问. 在类的外部,派生类均不可以访问
三. 多态
多态就是不同的对象可以调用相同的方法然后得到不同的结果,有点类似接口类的感觉,在python中处处体现着多态,比如不管你是列表还是字符串还是数字都可以使用+和*。
多态: 同一个对象的多种形态
即使子类继承了一个或多个父类, 依然可以执行自己本类中的方法
python 中有鸭子类型:
鸭子类型就是,不同的类中含有相同的方法(函数),统称这些类为鸭子
class Str:
def index(self):
pass
class List:
def index(self):
pass
class Tuple:
def index(self):
pass