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) 继承必须确保超累所 ...
随机推荐
- event loop整理
宏任务和微任务 让我们从浏览器加载 script 说起,当浏览器加载完 script 之后,不考虑 script 标签的 defer 属性,script 将被立即执行.这时,我们就创建了一个宏任务. ...
- Ubuntu的点滴-Vim、VM Tools、Samba、换源
<div id="article_content" class="article_content clearfix"> <link rel=& ...
- Linux速通01 操作系统安装及简介
操作系统 # a)操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. # 操作系统分为 系统调用接口 和 系统内核 # b)操作系统内核的定义 ...
- 【Arduino学习笔记03】面包板基础知识
终端带 这里有一块面包板,它后面的黏贴纸被撕去了.你可以看到很多在底部的平行金属条. 金属条的结构:金属条的顶部有一个小夹子.这些夹子能将一条导线或某个部件的引脚固定在塑料洞上,使它们放置在适当的位置 ...
- IDEA中便捷内存数据库H2的最简使用方式
在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...
- spring-cloud-alibaba之Nacos
在微服务构架中,集群服务间的需要调用时就需要知道各个服务的IP和提供服务的端口等信息,如果每个部署一个服务就配置一次,那么必然时非常麻烦的,因此我们需要一个能够统一管理的东西来解决这个问题,由此诞生了 ...
- 【linux】Linux删除文件后磁盘依旧占用空间的问题
转自https://blog.51cto.com/2483526/798379 感谢 1.用df 检查发现/根目录可用空间为0 [root@/]#df -h 2.用du检查发现各目录占用的空间都很少, ...
- 建立高速缓存机制-java版
前言 一台计算机的核心是CPU,它是计算机系统的运算和控制核心.由于它处理运算速度快,所以基本都会给CPU配置一级缓存,当CPU要读取一个数据时,首先从缓存中查询,如果没有在从内存或者磁盘块中找. ...
- 2019 GDUT Rating Contest III : Problem C. Team Tic Tac Toe
题面: C. Team Tic Tac Toe Input file: standard input Output file: standard output Time limit: 1 second M ...
- Django分页器组建
class Pagination(object): def __init__(self,current_page,all_count,per_page_num=2,pager_count=11): & ...