0. 继承的引入
1. 继承简介
· 继承是面向对象三大特性之一
· 通过继承我们可以使一个类获取到其他类中的属性和方法
· 在定义类时,可以在类名后面的括号中指定当前类的父类 (超类、基类)
· 继承提高了类的复用性。让类与类之间产生了关系。有了这个关系,才有了多态的特性。多态性与继承不继承没有直接关系
2. 方法重写
· 如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们称之为方法的重写(覆盖)
· 当我们调用一个对象的方法时:
· 会优先去当前对象中寻找是否具有该方法,如果有则直接调用
· 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
· 如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有找到就报错了
3. Super ( )
· super()可以获取当前类的父类
· 并且通过super( ) 返回对象调用父类方法时,不需要传递self
4. 多重继承
· 在Python中是支持多重继承的。也就是我们可以为一个类同时制定多个父类
· 可以在类名的()后边添加多个类,来实现多重继承
· 多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法
· 在开发中没有特殊情况,应该尽量避免使用多重继承。因为多重继承会让我们的代码更加复杂
· 编程的原则是要解耦合,而多重继承会增加程序代码的耦合
· 解耦合的作用:
· 1. 提高问题的解决概率。
· 2. 提高问题的解决效果
· 3. 提高问题的解决速度
· 4. 降低将来爆发隐患的可能性
· 如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,找第三个...前面会覆盖后面的
· 拓展: '类名.__bases__' 魔法方法,可以查看类的所有父类
5. 多态
· 多态是面向对象的三大特性之一。从字面理解就是多种形态
· 一个对象可以以不同形态去呈现
· 面向对象三大特性:
· 封装 确保对象中数据的安全
· 继承 保证了对象的扩展性
· 多态 保证了程序的灵活性
· Python中多态的特点
1、只关心对象的实例方法是否同名,不关心对象所属的类型;
2、对象所属的类之间,继承关系可有可无;
3、多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
4、多态是调用方法的技巧,不会影响到类的内部设计。
· 多态:具有不同功能的函数可以使用相同的函数名,调用不同的内容
· 有继承关系的类,多态举例:
6. 属性和方法
· 属性
· 类属性,直接在类中定义的属性是类属性
· 类属性可以通过类或类的实例访问到。但是类属性只能通过类对象来修改,无法通过实例对象修改
· 实例属性 通过实例对象添加的属性属于实例属性
· 实例属性只能通过实例对象来访问和修改,类对象无法访问修改
· 方法
· 在类中定义,以self为第一个参数的方法都是实例方法
· 实例方法在调用时,Python会将调用对象以self传入
· 实例方法可以通过类实例和类去调用
· 当通过实例调用时,会自动将当前调用对象作为self传入
· 当通过类调用时,不会自动传递self,我们必须手动传递self
· 类方法 在类的内容以 @classmethod 来修饰的方法属性类方法
· 类方法第一个参数是 cls 也会自动被传递。cls 就是当前的类对象
· 类方法和实例方法的区别,实例方法的第一个参数是self,类方法的第一个参数是cls
· 类方法可以通过类去调用,也可以通过实例调用
· 静态方法
· 在类中用 @staticmethod 来修饰的方法属于静态方法
· 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用
· 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数
· 静态方法一般都是些工具方法,和当前类无关
· 拓展:__new__方法
__new__()方法用于创建与返回一个对象。在类准备将自身实例化时调用。
以下代码打印输出的顺序?
A.__init__,__new__
B.__init__
C.__new__
D.__new,__init__
class Demo(object):
def __init__(self):
print("__init__")
def __new__(cls, *args, **kwargs):
print("__new__")
d = Demo()
答案:C
注意
· __new__()方法用于创建对象
· __init__()方法在对象创建的时候,自动调用
· 但是此处重写了父类的__new__()方法,覆盖了父类__new__()创建对象的功能,所以对象并没有创建成功。所以仅执行__new__()方法内部代码
对象创建执行顺序
1.通过__new__()方法创建对象
2.并将对象返回,传给__init__()
在自定义类中实现创建对象
思路
重写父类__new__()方法
并且在该方法内部,调用父类的__new__()方法
class Demo(object):
def __init__(self):
print("__init__")
def __new__(cls, *args, **kwargs):
print("__new__")
return super().__new__(cls)
d = Demo()
注意
· 在创建对象时,一定要将对象返回,在会自动触发__init__()方法
· __init__()方法当中的self,实际上就是__new__返回的实例,也就是该对象
__init__()与__new__()区别
· __init__实例方法,__new__静态方法
· __init__在对象创建后自动调用,__new__创建对象的方法
7. 单例模式
单例模式介绍
单例模式是一种常用的软件设计模式。也就是说该类只包含一个实例。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
通常应用在一些资源管理器中,比如日志记录等。
单例模式实现
思路
· 当对象不存在时,创建对象
· 当对象存在时,永远返回当前已经创建对象
class single(object):
__isinstance = None
def __new__(cls, *args, **kwargs):
if cls.__isinstance is None:
cls.__isinstance = super().__new__(cls)
return cls.__isinstance
else:
return cls.__isinstance
a = single()
b = single()
print(id(a))
print(id(b))