面向对象特性也称之为:三大基石
一 封装
1. 对象都有明确的边界,把属性保护在边界之内
将内部和外部进行了隔离,外部不能直接访问内部属性或方法,内部不能直接访问外部的属性或方法
封装也称之为:数据隐藏
2. 封装的粒度:
控制一个对象的范围---边界,封装的目标:属性和方法
封装的粒度过大:导致封装的目标过于复杂,不利于各司其职
封装的粒度过小:导致封装的目标过于简单,让过程过于复杂
# class A:
# age=18
#
# class B:
# name='建国'
# def hehe(self):
# print(age)
#
# b=B()
#b.hehe()
# print(age)
class School:
class Teacher:
pass
class Student:
pass
teacher=Teacher()
student=Student()
def getClass(self):
print('上课')
s=School()
print(s.student)
二 继承
物质---生物---动物---哺乳动物---狗类---哈士奇,泰日天,中华田园犬
继承关系
更抽象:父类:是子类的抽象
更具体:子类:是父类的具象(特殊)
汽车---货车+轿车+卡车+客车
定义形式: class 子类类名(父类类名):
父类:也称之为基类,超类 BaseClass
object:是Python中的一个类:根类,是所有类的父类
class Parent(object):
pass
class Children(Parent):
pass
三 继承的特点
1. 子类可以继承父类中的成员
属性+方法 统称为成员
2. 子类不能继承父类中的私有成员
3. 可扩展性:
父类扩展了子类
4. 多继承
5. init方法的调用:(子类可以调用父类的成员)
1. 当子类拥有__init__()方法时,只会调用子类的方法
2. 当子类没有__init__()方法时,会调用父类中的init
6. 访问父类的init方法:(子类调用父类成员的方法)
1. 父类类名.父类方法(self)
2. super().父类方法()
3. 父类类名().父类方法()
四 方法覆盖
方法覆盖:子类用特殊的方法实现,替换掉父类继承下来的一般的方法实现
语法要求:子类和父类中的方法名完全一致
注意:父类中的方法名不能省略,因为方法名相当于接口,无论子类是否实现了接口,子类都会拥有父类中的方法(接 口)
接口:
接口就是标准
class Animal:
def eat(self):
print('Animal can eat')
class Dog(Animal):
def eat(self):
print('dog can eat')
class Cat(Animal):
def eat(self):
print('cat can eat')
class Fish(Animal):
def eat(self):
print('fish can eat')
d=Dog()
c=Cat()
f=Fish()
d.eat()
c.eat()
f.eat()
五 多继承
一个类可以同时继承多个父类
语法:
class 子类名(父类1,父类2...)
1. 尽量避免多继承,可能会导致混乱
2. 多继承中父类的属性和方法有先后继承关系
3. 钻石继承问题(菱形继承)
多个子类共同继承了一个父类,可能会导致资源浪费(创建多次父类)
解决方案:使用super()
原因:super的底层实现是按照mro实现的
mro:继承链式关系
mro中的链式关系中,所有的类只会出现一次
4. 循环继承问题
一个类可以有多个子类,也可以有多个父类,其中任何一个父类不能是自己的子类
多继承中,子类的子类不能直接继承object
class A:
def __init__(self):
print('A')
class B(A):
def __init__(self):
A.__init__(self)
print('B')
class C(A):
def __init__(self):
A.__init__(self)
print('C')
class D(B,C):
def __init__(self):
B.__init__(self)
C.__init__(self)
print('D')
d=D() # A B A C D A出现了两次,A多占用了一个内存
============================================
#解决???
class A:
def __init__(self):
print('A')
class B(A):
def __init__(self):
super().__init__()
print('B')
class C(A):
def __init__(self):
super().__init__()
print('C')
class D(B,C):
def __init__(self):
super().__init__()
print('D')
d=D()
class A:
def __init__(self):
print('A')
class B:
def __init__(self):
print('B')
class C(A,object):
def __init__(self):
print('C')
class F(C,object):
def __init__(self):
print('F')
class D(A,B):
def __init__(self):
print('D')
print(C.mro())
print(D.mro())
print(F.mro())
六 补充
Python 2.2版本引入super
Python2:没有super()用法
Python3:有super()用法
1. super():
无参的形式相当于调用super(type,obj):
2. super(type,obj):
type:类
obj:实例
super(type,obj):选取mro中type类右边的第一个类作为返回对象