一、多态
• 多态是面向对象的三大特性之一。从字面理解就是多种形态
• 一个对象可以以不同形态去呈现
• 面向对象三大特性
• 封装 确保对象中数据的安全
• 继承 保证了对象的扩展性
• 多态 保证了程序的灵活性
• Python中多态的特点
• 1、只关心对象的实例方法是否同名,不关心对象所属的类型;
• 2、对象所属的类之间,继承关系可有可无;
• 3、多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
• 4、多态是调用方法的技巧,不会影响到类的内部设计
二、属性和方法的总结
• 属性
• 类属性,直接在类中定义的属性是类属性
• 类属性可以通过类或类的实例访问到。但是类属性只能通过类对象来修改,无法通过实例对象修改
• 实例属性 通过实例对象添加的属性属于实例属性
• 实例属性只能通过实例对象来访问和修改,类对象无法访问修改
• 方法
• 在类中定义,以self为第一个参数的方法都是实例方法
• 实例方法在调用时,Python会将调用对象以self传入
• 实例方法可以通过类实例和类去调用
• 当通过实例调用时,会自动将当前调用对象作为self传入
• 当通过类调用时,不会自动传递self,我们必须手动传递self
• 类方法 在类的内容以@classmethod 来修饰的方法属性类方法
• 类方法第一个参数是cls 也会自动被传递。cls就是当前的类对象
• 类方法和实例方法的区别,实例方法的第一个参数是self,类方法的第一个参数是cls
• 类方法可以通过类去调用,也可以通过实例调用
• 静态方法
• 在类中用@staticmethod来修饰的方法属于静态方法
• 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用
• 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数
• 静态方法一般都是些工具方法,和当前类无关
精简版:
类
属性:
类属性:直接定义在类中的属性
类属性可以通过类和实例对象来调用
类属性只能通过类对象来修改,不能通过实例对象来修改
方法
@classmethod
实例对象和类对象都可以调用
实例
属性
实例属性︰通过实例对象来添加的属性就是实例属性
只能通过实例对象调用,不能使用类对象调用
实例属性只能通过实例对象来修改,不能通过类对象来修改
方法
有self就是实例的方法
类对象和实例对象都可以调用,但是类对象需要传递一个实例对象参数
静态方法(本质是函数,与类,实例无关)
@staticmethod
功能方法、工具方法
三、单例模式
3.1单例模式的引入(__new__方法)
new()方法
new()方法用于创建与返回一个对象。在类准备将自身实例化时调用。
class Demo(object):
def __init__(self):
print("__init__")
def __new__(cls, *args, **kwargs):
print("__new__")
d = Demo()
结果
__new__
注意
• new()方法用于创建对象
• init()方法在对象创建的时候,自动调用
• 但是此处重写了父类的__new__()方法,覆盖了父类__new__()创建对象的功能,所以对象并没有创建成功。所以仅执行__new__()方法内部代码
对象创建执行顺序
• 1.通过__new__()方法创建对象
• 2.并将对象返回,传给__init__()
思路
• 重写父类__new__()方法
• 并且在该方法内部,调用父类的__new__()方法
class Person(object):
def __init__(self):
print("__init__")
self.name="张三"
def __new__(cls):
print('__new__')
ob = object.__new__(cls)#ob为Person实例对象
print(ob)
return ob
p1 = Person()
print(p1)
print(p1.name)
结果
__new__
<__main__.Person object at 0x000001A454359748>
__init__
<__main__.Person object at 0x000001A454359748>
张三
注意
• 在创建对象时,一定要将对象返回,在会自动触发__init__()方法
• init()方法当中的self,实际上就是__new__返回的实例,也就是该对象
init()与__new__()区别
• __init__实例方法,__new__静态方法
• __init__在对象创建后自动调用,__new__创建对象的方法
3.2单例模式
单例模式介绍
单例模式是一种常用的软件设计模式。也就是说该类只包含一个实例。
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
通常应用在一些资源管理器中,比如日志记录等。
单例模式实现
思路
• 当对象不存在时,创建对象
• 当对象存在时,永远返回当前已经创建对象
"""
做一个判断:1. 如果实例存在了,我们就不在调用super这个方法,而是直接返回之前的那个实例对象
2. 如果不存在,就调用super方法创建实例并且返回
"""
class Single(object):
obj = None
def __new__(cls, *args, **kwargs):
if cls.obj is None:
cls.obj = super().__new__(cls)
return cls.obj
else:
return cls.obj
s = Single()
s1 = Single()
print(s)
print(s1)
结果
<__main__.Single object at 0x000002C2F8AF93C8>
<__main__.Single object at 0x000002C2F8AF93C8>
注:class声明的时候会跑一次,然后后面就不会再跑了