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) 继承必须确保超累所 ...
随机推荐
- Ping 的工作原理你懂了,那 ICMP 你懂不懂?
计算机网络我也连载了很多篇了,大家可以在我的公众号「程序员cxuan」 或者我的 github 系统学习. 计算机网络第一篇,聊一聊网络基础 :计算机网络基础知识总结 计算机网络第二篇,聊一聊 TCP ...
- 微信小程序:列表渲染
wx:for,(wx:for-item,wx:for-index),wx:key. 列表循环包括数组循环和对象循环 一.数组循环 此时控制台报错如下:属性"wx:key"可以提高性 ...
- 搭载华为麒麟9000的Mate X2:秒售罄,一机难求
本文首发 | 公众号:lunvey 昨日10点,搭载了麒麟9000芯片的华为Mate X2正式开售,定价17999,对于手机来说,价格实在是高昂. 虽然价格高昂,但是一分钱一分货,对于想抢先体验的网友 ...
- 第6章 for循环
目标 掌握for循环的使用方法 理解for循环的嵌套 在第3章中,我们学习了times循环.times循环可以让一段代码重复执行指定的次数. 本章我们将学习另一种循环结构--for循环.它同样能让一段 ...
- POJ-3026(图上的最小生成树+prim算法+gets函数使用)
Borg Maze POJ-3026 一开始看到这题是没有思路的,看了题解才知道和最小生成树有关系. 题目的意思是每次走到一个A或者S就可以分为多个部分继续进行搜索.这里就可以看出是从该点分出去的不同 ...
- Java安全初学之反射
前言: 复现fastjson的时候深深意识到了需要好好学习一下Java和Java安全,激情的学习了一番java安全中重要的几部分:反序列化.反射.rmi.动态代理,从反射开始做个总结. 反射:java ...
- python学习之web中的html基础
HTML简介及相关标签介绍 首先,我们要了解什么是HTML? HTML被称作超文本标记语言,是一门标记语言,即该语言由各类标记标签组成. 为什么学python要学HTML? 不管学习哪个语言,我们最 ...
- python基础学习之字符串的功能方法
字符串:str的功能记录(该类需要记忆) .isdecimal():意思是判断是否由数字构成,仅仅可以解析"123" a='123' d=a.isdecimal() p ...
- webpack4.x 从零开始配置vue 项目(一)基础搭建项目
序 现在依旧记得第一次看到webpack3.x 版本配置时候的状态 刚开始看到这些真的是一脸懵.希望这篇文章能帮到刚开始入门的同学. webpack 是什么? webpack是一个模块化打包工具,w ...
- 提升Idea启动速度与Tomcat日志乱码问题
提升Idea启动速度与Tomcat日志乱码问题 前言 由于重装了一次Idea,所以有些设置时间就忘了,在此做个记录,以便以后忘记后可以来翻阅 Idea启动速度 一.将Idea所在的 安装文件夹 在wi ...