Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)
一.面向对象编程几个特征(封装, 继承,多态)
1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用.
2.继承:子类可以继承父类的方法和属性.
3.多态建立在继承的基础之上, 先有继承 才能有多态, 指子类继承父类后分别重写覆盖了父类方法.即父类的同一个方法, 在不同的子类当中表现出不同的形式
二.类对象
由python解释器根据class代码自动生成的一个对象, 由所有的实例对象共享
三.__new__()方法的作用
用于创建新的实例对象, 当需要创建实例对象时自动执行
四.__init__()方法的作用
在__new__()方法创建出来了实例对象后, 就会调用 __init__()方法, 对这个已经实例化的对象进行属性的初始化
五.单例模式的实现:(通过重写__new__()实现单例模式)
class Item(object):
__instance = None # 定义一个类属性
def __new__(cls, *args, **kwargs): # 重写父类的__new__()方法, cls 指代当前类对象本身, __new__()是一个类方法
if not cls.__instance: # 如果__instance类属性没有进行赋值, 就调用父类的__new__()方法创建一个实例化的对象,并赋值给 __instance
cls.__instance = object.__new__(cls)
return cls.__instance # 将该实例对象进行返回, 如果__instance已经被赋值了, 就返回已经存在的__instance所指向的实例对象,从而实现单例
obj = Item()
print(id(obj))
obj2 = Item()
print(id(obj2))
进行输出, 发现虽然进行了两次类的实例化, 但是他们的内存id是一样的, 可以证明得到的是同一个实例对象, 单例需求得到实现:
4449800144
4449800144
注意:
1.只重写父类的__new__()方法实现单例的缺陷:
仍然可以通过调用__init__()方法, 修改已经初始化的属性, 如果需要设置初始化的属性也不可以修改, 需要改造__init__()方法:
class Item(object):
__instance = None
__flag = False
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, name): # self 指向所实例化的对象本身
if not self.__flag:
self.name = name
self.__flag = True
obj = Item("lowman")
print(obj.name)
obj2 = Item("isbusy")
print(obj2.name)
输出:
lowman
lowman
第二次重新赋值没有生效, 需求实现
六.python2 与python3 调用父类方法(使用super()方法调用父类方法更加节省资源)
在子类的方法中直接使用super()调用父类的方法即可
python3: super().__init__(*args, **kwargs)
python2: super("当前类名", self).__init__(*args, **kwargs)
Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)的更多相关文章
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
随机推荐
- loadrunner12.5-添加检查点
1.点击缩略图资源管理器,找到需要添加检查点的页面. 2.选中需要添加检查点的页面,切换到快照tab,选择“树”型显示方式. 3.在响应窗口下,找到需要添加的检查点的内容,选中--右键--添加文本检查 ...
- code4906 删数问题
题目: 键盘输入一个高精度的正整数n(<=240位), 去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数. 编程对给定的n和s,寻找一种方案,使得剩下的数最小. Simple Inp ...
- Spring官方文档翻译(1~6章)
Spring官方文档翻译(1~6章) 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档.参考中文文档 一.S ...
- 01 Linux 网络配置和克隆
Linux 网络配置和克隆 一.配置 Linux 网络 当在 VMware 中安装完 Linux 以后需要通过一些网络配置才能使 Linux 能够连能网络: 首先如果是在虚拟机上安装的 Linux 必 ...
- spring mvc 默认页面
只需要在servlet.xml页面中添加如下配置: <mvc:view-controller path="/" view-name="login"/> ...
- 卡特尔16PF性格测试与答案
大学生在职业生涯规划时,必须充分注意到自己的性格和职业的适宜性.性格是指一个人在生活中形成的对现实的稳定的态度和行为方式.研究表明,性格影响着一个人的职业取向,由于性格的不同,每个人对工作和职业的态度 ...
- 2018.10.12 NOIP模拟 字符处理(模拟)
传送门 sb模拟,考试跟着sb了90分. 代码
- 2018.10.02 NOIP模拟 序列维护(线段树+广义欧拉定理)
传送门 一道比较好的线段树. 考试时线性筛打错了于是弃疗. 60分暴力中有20分的快速幂乘爆了于是最后40分滚粗. 正解并不难想. 每次区间加打懒标记就行了. 区间查询要用到广义欧拉定理. 我们会发现 ...
- 2018.08.20 bzoj1143: [CTSC2008]祭祀river(最长反链)
传送门 一道简单的求最长反链. 反链简单来说就是一个点集,里面任选两个点u,v都保证从u出发到不了v且v出发到不了u. 链简单来说就是一个点集,里面任选两个点u,v都保证从u出发可以到达v或者v出发可 ...
- flask_login
一.配置 对于登录系统,我们将会使用到两个扩展,Flask-Login 和 Flask-OpenID.在microblog.py中配置: Flask-OpenID 扩展需要一个存储文件的临时文件夹的路 ...