python重写带参数的父类方法_python 类 单例

Python 类

上一篇文章说道python中的类,对类做了简单的介绍,本次我们介绍一下类中的继承和单例。

1、继承

继承这个概念很好理解,就和我们生活中的继承是一个意思,不同的是,父类的每一个子类都可以完全继承父类的方法和属性,一个子类可以有多个父类,在每个子类中都可以对付类中的属性和方法进行修改。

v2-975a5d4c3ada0e16003d72f56580b8bf_b.jpg

从图中的代码可以看出,父类中没有定义author属性,但是子类对像在调用父类的print_author方法的时候并没有出错,这是因为在子类创建对像的时候都新增了author这个属性,父类中的get_title方法会直接抛出异常,但是在调用的时候并没有出现异常,这是因为每个子类都重新定义了get_title这个方法。总的来说这段代码体现了三个要点:a、子类可以继承父类的属性和方法(object_type、get_author),b、子类重写了父类方法(get_title),c、子类新增属性(author)。

说了这么多还有一个我们没有提到的东西,在每个子类的方法中都有

Entity.__init__(self, 'video')这行代码,那这行代码到底是做什么的呢?大家应该猜到了,这行代码是调用了父类的__init__方法。我们只能这么调用父类的方法么?显然不是。我们还可以通过super(cls,self).xxx(*args,**kwargs)来调用父类的方法,在Entity.__init__(self, 'video')中我们可以很明显的看到我们调用的是哪一个父类,在super()方法中我们会调用哪一个父类的方法呢?要想知道这个我们需要先了解一下类的一个方法mro(),这个方法会输出当前子类的多重继承的顺序,如图:

v2-f482cf6f3178eeb2b9cd6a61a90084fa_b.jpg

从图中可以看出子类C的继承顺序为B->A,super(cls,self)方法中有两个参数分别为cls和self,很明显,cls代表类,self代表了实例对象,那这个cls和mro()方法返回的父类继承顺序有什么关系呢?这是一个定位的关系,super(cls,self)方法会先找到cls在父类继承列表中的位置,然后返回下一个父类,就像代码中展示的,super(B, self).get_name()是调用了父类A中的get_name()方法,说到这里我们大胆测猜想一下,如果cls的值是A,那应该抛出异常,下面我们来验证一下:

v2-cba9f6e363e40e4b8c17890955f1262d_b.jpg

2、抽象基类

说到继承就不得不说抽象基类,什么是抽象基类呢?简单的说,抽象基类只能做为基类,本身不可以创建对像的。如图:

v2-84e9392add0e508cc16f893b92b8d8c8_b.jpg

3、单例

类还有一个经常被问到的问题:单例,什么是单例呢?单例的意思很简单,就是只创建一个实例对象,不知道你有没有关注过,电脑桌面的垃圾桶,不论你打开几次,都只会有一个操作窗口,这个就是单例。对于python中的单例,想要实现单例,首先要知道类是如何创建单例的,知道是如何创建的我们就很方便去实现单例。两个思路:只调用一次创建方法,或者创建方法每次返回相同的实例。

a、__new__方法实现

v2-a9817d5429c217c98039b7e4bc666465_b.jpg

b、元类实现

v2-9051856e278d90899a2c397969bb361b_b.jpg

c、函数装饰器

v2-84ebc39c1c5301711a6b0c30f757348f_b.jpg

d、类装饰器

v2-32ea97164c896fecf3b8e0aefae90e79_b.jpg

从以上图中可以看出,__new__方法、元类和类装饰器每次都会调用创建实例的方法,但是只有在第一次调用的时候才会创建实例对象,在此调用都是返回之前创建的对像,通过函数装饰器实现单例就是在第一次会调用类创建实例,之后就不在调用类创建实例了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值