OOP-面向对象(三)
魔术方法的使用
# 使用 __new__ 创建单态模式
class Singleton():
__obj = None
def __new__(cls, *args, **kwargs):
if cls.__obj is None:
cls.__obj = object.__new__(cls)
return cls.__obj
obj1 = Singleton()
obj2 = Singleton()
print(id(obj1), id(obj2))
# 140484580496528 140484580496528
# __new__() 是一种负责创建类实例的静态方法,该方法会优先 __init__() 初始化方法被调用。
# 如果 __new__ 方法返回其他类的实例化。则不会在本类中执行 __init__ 方法
#__call__ 魔术方法
'''
触发时机:把对象当作函数调用的时候自动触发
功能: 模拟函数化操作
参数: 参数不固定,至少一个self参数
返回值: 看需求
'''
#__del__ 魔术方法(析构方法)
'''
触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候]
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无
'''
### 与类相关的魔术属性
# __dict__ 获取对象或类的内部成员结构
# __doc__ 获取对象或类的内部文档
# __name__ 获取类名函数名
# __class__ 获取当前对象所属的类
# __bases__ 获取一个类直接继承的所有父类,返回元组
类中的方法
# (1) 普通方法
# (2) 绑定方法:①绑定带对象 ②绑定到类
# (3) 静态方法:无论是对象还是类调用静态方法,都不用传递任何参数
class adog():
# 普通无参方法
def tail():
print('小狗喜欢摇尾巴')
# 绑定到对象方法
def wangwang(self):
print('小狗看到陌生人就旺旺')
# 绑定到类方法
@classmethod
def tian(cls):
print('小狗喜欢舔舌头')
# 静态方法
@staticmethod
def jump(something):
print('小狗喜欢接{}'.format(something))
# 普通无参方法
adog.tail()
obj = adog()
# obj.tail() # TypeError
# 绑定到对象方法
obj.wangwang()
# 绑定到类方法
adog.tian()
obj.tian()
# 静态方法
obj.jump('111')
adog.jump('222')
property
# 用property类装饰器,修饰的方法,变为描述符
# 效果:把类中方法变为属性使用,用来控制描述符的获取,设置,删除
class MyClass():
def __init__(self, name):
self.name = name
@property # 获取
def username(self):
return self.name
@username.setter # 设置
def username(self, val):
self.name = val
@username.deleter # 删除
def username(self):
del self.name
# 获取属性的值
obj = MyClass('小红')
print(obj.username)
# 修改属性的值
obj.username = '小明'
# 删除属性的值
del obj.username
#========================
# 方法二
class MyClass():
def __init__(self, name):
self.name = name
# 获取
def get_username(self):
return self.name
# 设置
def set_username(self, val):
self.name = val
# 删除
def del_username(self):
del self.name
username = property(get_username, set_username, del_username)
# 获取属性的值
obj = MyClass('小红')
print(obj.username)
# 修改属性的值
obj.username = '小明'
# 删除属性的值
del obj.username
反射
通过字符串操作类对象 或者 模块中的相关成员的操作
① hasattr() 检测对象/类是否有指定的成员
② getattr() 获取对象/类成员的值
③ setattr() 设置对象/类成员的值
④ delattr() 删除对象/类成员的值
# part1 通过字符串反射 类 / 对象 中的成员
class Myclass():
def __init__(self, name, sex):
self.name = name
# 男 请输入 1 否则输入 0
self.sex = sex
def hobby(self):
print('{}爱好{}'.format(self.name, '女' if self.sex == '男' else '男'))
# ① hasattr() 检测对象、类是否有指定的成员
# 对象
obj = Myclass('张三', '男')
res = hasattr(obj, 'name') # True
res = hasattr(obj, 'hobby') # True
# 类
res = hasattr(Myclass, "name") # 由于没有初始化,不会执行__init__ ,所有下面返回 False
res = hasattr(Myclass, "hobby") # True
# ② getattr() 获取对象 / 类成员的值
res = getattr(obj, 'name1', '没有当前对象的成员')
print(res) # 没有当前对象的成员
res_func = getattr(obj, 'hobby')
res_func() # 张三爱好女
# ③ setattr() 设置/添加 对象 / 类成员的值
setattr(obj, 'name', '李四')
obj.hobby() # 李四爱好女
setattr(obj, 'education', '专科')
print(obj.education)
# ④ delattr() 删除对象 / 类成员的值
delattr(obj, 'education')
# part2 通过字符串反射 模块 中的成员
# sys.modules 返回一个系统字典,字典的键是加载的所有模块
#字典中的__main__这个键对应的是当前文件的模块对象;
def f1():
print('这是f1函数')
import sys
module = sys.modules['__main__']
res = getattr(module, 'f1')
res()
OOP-面向对象(三)的更多相关文章
- OOP面向对象三大特点
OOP面向对象三大特点 (一)封装:将现实中一个事物的属性和功能集中定义在一个对象中.(创建对象) 创建对象的3种方式: 1.直接量方式:(创建一个单独的对象) var obj={ 属性名:值, ...
- oop 第三次作业 文件读写
oop第三次作业 GitHub 对于迟交我感到很抱歉 031602510 体会 这次的用到了之前的文件读写,传参 定义函数有返回值,使代码更加简洁.面向对象的程序设计,在面对函数多元的情况下,编程更加 ...
- 用C实现OOP面向对象编程(1)
如摘要所说,C语言不支持OOP(面向对象的编程).并这不意味着我们就不能对C进行面向对象的开发,只是过程要复杂许多.原来以C++的许多工作,在C语言中需我们手动去完成. 博主将与大家一起研究一下如下用 ...
- OOP 面向对象 七大原则 (二)
OOP 面向对象 七大原则 (二) 上一篇写到了前四个原则,这一篇继续~~ 接口隔离:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 又是一句大白话~就是说接口尽量 ...
- OOP 面向对象 七大原则 (一)
OOP 面向对象 七大原则 (一) 大家众所周知,面向对象有三大特征继承封装多态的同时,还具有这七大原则,三大特征上一篇已经详细说明,这一篇就为大家详解一下七大原则: 单一职责原则,开闭原则,里氏 ...
- OOP面向对象 三大特征 继承封装多态
OOP面向对象 ----三大特征 继承封装多态 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构 ...
- Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- Python面向对象三要素-封装(Encapsulation)
Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...
- 深入java面向对象三:抽象类和接口(转载)
文章系转载,地址: http://blog.csdn.net/xw13106209/article/details/6923556 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架 ...
- OOP面向对象程序设计原则
OOP面向对象程序设计原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭 里氏代换原则(Liskov Substitution Principle) 继承必须确保超累所 ...
随机推荐
- 一文帮你搞懂 Android 文件描述符
介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏. 一.什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 于Linux 系统 ...
- js浅拷贝(地址引用)和深拷贝(克隆)
浅拷贝和深拷贝相对于引用类型而言的. js有两大类型值类型(基本数据类型)和引用类型(object,function,array): 值类型保存在栈上,引用类型保存在堆上. 浅拷贝只是单纯的拷贝对象的 ...
- 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图
之前写过三篇文章,收获了极其不错的阅读量与转发量: 你真的会用 VS Code 的 Ctrl.Shift和Alt吗?高效易用的快捷键:多光标.跳转引用等轻松搞定 VS Code 中的 Vim 操作 | ...
- 再探命令行传参之c与python
继上一次java命令行传参 python sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:python解释 ...
- MyBatis(一):JDBC使用存在的问题
JDBC使用步骤: a:加载 JDBC 驱动程序 b:创建数据库的连接对象Connection c:根据链接获取Statement d:拼接SQL语句及设置参数 e:执行SQL并获取结果集 f:关闭使 ...
- Typora的一些快捷键
语法格式 快捷键 标题 # + 空格 = 一级标题, ## + 空格 =二级标题, 以此类推 shift + 数字1 =一级标题 ,shift + 数字2 =二级标题 , 以此类推 有序列表 1 ...
- Raft共识算法详解
Raft共识算法 一.背景 拜占庭将军问题是分布式领域最复杂.最严格的容错模型.但在日常工作中使用的分布式系统面对的问题不会那么复杂,更多的是计算机故障挂掉了,或者网络通信问题而没法传递信息,这种情况 ...
- springboot系列四:springboot整合mybatis jsp
一.用IDEA 创建maven项目 项目目录结构 1.添加pom jar依赖 <?xml version="1.0" encoding="UTF-8"?& ...
- Python接口自动化实现
一.代码结构: 二.接口签名实现: 1. 设所有发送的数据集合为M,将集合M内非空参数值的参数按照[参数名+"="+参数值]的ASCII码从小到大排序(字典序),然后按拼接key1 ...
- LAMP环境搭建与配置
下载mysql 解压 运行错误 下载插件 启动成功 安装Apache 解压 报错 安装插件 再次报错 修改文档 成功 安装插件 下载 安装php 安装完成 解析php 安装完成 虚拟主机(共享主机, ...