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) 继承必须确保超累所 ...
随机推荐
- SpringBoot读取资源目录下的文件
需要读取resources目录下的文件,那么方法如下: 假设在资源目录下的template目录下有一个文件a.txt,获取到文件流的方式 InputStream stream = this.getCl ...
- 185. 部门工资前三高的所有员工 + 多表联合 + join + dense_rank()
185. 部门工资前三高的所有员工 LeetCode_MySql_185 题目描述 方法一:使用join on # Write your MySQL query statement below sel ...
- Java程序员必备后台前端框架--Layui【从入门到实战】(一)
layui入门使用及图标的使用 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] [编程工具:IDEA] 下载Layui与文件分析 下载直接去官网下载即可 文件分析 下载完成后,解压会 ...
- Linux:使用systemd管理进程
Blog:博客园 个人 概述 systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能 ...
- 再探命令行传参之c与python
继上一次java命令行传参 python sys模块包括了一组非常实用的服务,内含很多函数方法和变量,用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互,如:python解释 ...
- 鸿蒙OS前端开发入门指南:网络图片_Image渲染网络图片
目录: 1.开启明文传输 2.权限申请 3.引入http插件 4.案例展示 5.<鸿蒙OS前端开发入门指南>文章合集 开启明文传输 在config.json配置文件添加如下配置(如果不开启 ...
- python爬取考研专业信息
伴随着2021考研成绩的公布,2021考研国家线也即将到来.大家是否有过考研的想法了?如果想考研我们就需要了解很多的信息,但是百度的上有太多信息需要我们去一一的鉴别,是比较浪费时间的.所以我们可以学习 ...
- CentOS7.8搭建STF
安装命令插件(rz.sz): yum install -y lrzsz wget unzip zip编辑配置文件导致命令无法使用时:export PATH=/usr/local/sbin:/usr/l ...
- LZZ高级程序语言设计之多重for循环
public class Mq { public static void main(String args[]) { System.out.println("到底去还是不去呢?") ...
- 用 Numba 加速 Python 代码
原文出自微信公众号:Python那些事 一.介绍 pip install numba Numba 是 python 的即时(Just-in-time)编译器,即当你调用 python 函数时,你的全部 ...