Python 面向对象之双下方法,内置函数

isinstance和issubclass

isinstance(obj,cls)      # 检查是否obj是否是类 cls 的对象

class Foo(object):passobj = Foo()isinstance(obj, Foo)  # ture

issubclass(sub, super)  # 检查sub类是否是 super 类的派生类

class Foo(object):passclass Bar(Foo):passissubclass(Bar, Foo)   # ture

反射

1 什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数 hasattr getattr setattr delattr

下列方法适用于类和对象(一切皆对象,类本身也是一个对象),还可以反射类中的模块,查看模块是否存在,总而言之,只要能用a.b 的都可以用

class Foo:f = '类的静态变量'def __init__(self,name,age):self.name=nameself.age=agedef say_hi(self):print('hi,%s'%self.name)obj=Foo('egon',73)# hasattr(*args, **kwargs) 检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))# getattr(object, name, default=None) 获取属性
n = getattr(obj,'name')
print(n)                                 # egon
func = getattr(obj,'say_hi')
func()                                   # hi,egon
print(getattr(obj,'aaaaaaaa','不存在啊')) # 不存在啊# setattr(x, y, v) 设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)                     # {'name': 'egon', 'age': 73, 'sb': True, 'show_name': <function <lambda> at 0x00000207DFFE6598>}
print(obj.show_name(obj))               # egonsb# delattr(x, y) 删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111') # 不存在,则报错

__str__、__repr__和__fromat__

改变对象的字符串显示__str__,__repr__,自定制格式化字符串__format__

str函数 或者 print函数   ---> obj.__str__()
repr 或者 交互式解释器 ---> obj.__repr__()
如果__str__没有被定义,那么就会使用__repr__来代替输出(备胎)
注意:这俩方法的返回值必须是字符串,否则抛出异常

#_*_coding:utf-8_*_format_dict={'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
}
class School:def __init__(self,name,addr,type):self.name=nameself.addr=addrself.type=typedef __repr__(self):return 'School(%s,%s)' %(self.name,self.addr)def __str__(self):return '(%s,%s)' %(self.name,self.addr)def __format__(self, format_spec):# if format_specif not format_spec or format_spec not in format_dict:format_spec='nat'fmt = format_dict[format_spec]return fmt.format(obj=self)s1=School('oldboy1','北京','私立')
print('from repr: ',repr(s1))      # from repr: School(oldboy1,北京)
print('from str: ',str(s1))        # from str: (oldboy1,北京)
print(s1)                          # (oldboy1,北京)print(format(s1,'nat'))            # oldboy1-北京-私立
print(format(s1,'tna'))            # 私立:oldboy1:北京
print(format(s1,'tan'))            # 私立/北京/oldboy1
print(format(s1,'asfdasdffd'))     # oldboy1-北京-私立

__del__

析构方法,当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:def __del__(self):print('执行我啦')f1=Foo()
del f1
print('------->')# 输出结果
执行我啦
------->

item系列

使类中的静态变量可以像使用字典的方式一样使用,__getitem__   \__setitem__     \__delitem__

class Foo:def __init__(self,name):self.name=namedef __getitem__(self, item):print(self.__dict__[item])def __setitem__(self, key, value):self.__dict__[key]=valuedef __delitem__(self, key):print('del obj[key]时,我执行')self.__dict__.pop(key)def __delattr__(self, item):print('del obj.key时,我执行')self.__dict__.pop(item)f1=Foo('sb')
f1['age']=18        # 等同于f1.setitem('age',18)
f1['age1']=19
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__) # {'name': 'alex'}

__new__

构造方法,__new__ 实在执行__init__ 之前执行的,object 已实现该方法,所以一般不用写,作用是创建一个self

class A:def __init__(self):self.x = 1print('in init function')def __new__(cls, *args, **kwargs):print('in new function')return object.__new__(A, *args, **kwargs)a = A()
print(a.x)

单例模式

class Singleton:def __new__(cls, *args, **kw):if not hasattr(cls, '_instance'):   # 判断类的命名空间中是否存在变量_instancecls._instance = object.__new__(cls, *args, **kw)   # 在类的命名空间中加了一个私有的静态变量_instancereturn cls._instanceone = Singleton()
two = Singleton()two.a = 3
print(one.a)   # 3
# one和two完全相同,可以用id(), ==, is检测
print(id(one)) # 29097904
print(id(two)) # 29097904
print(one == two) # True ,实际调用__eq__ 方法
print(one is two) # True

__call__

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo() # 执行 __init__
obj()       # 执行 __call__

__len__

class A:def __init__(self):self.a = 1self.b = 2def __len__(self):return len(self.__dict__)
a = A()
print(len(a))

__hash__

object中未实现,如果有需求,需要自己实现

class A:def __init__(self):self.a = 1self.b = 2def __hash__(self):return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))

__eq__

object已实现

class A:def __init__(self):self.a = 1self.b = 2def __eq__(self,obj):if  self.a == obj.a and self.b == obj.b:return True
a = A()
b = A()
print(a == b)

集合set判断的依据是 先判断__eq__ ,如果相同,在判断__hash__, 如果两者都相同,则认为相同
String类型的equals方法 只比较内容 不比较是否来引用同一个对象
== 实际调用__eq__ 方法,判断值是否相等
is 判断的是内存地址,= 赋值时赋值的内存地址 , 如果赋值时使用字符串,列表等,存在小地址池的原因,也会存在内存地址相同的情况 ,is 运算符比 == 效率高,在变量和None进行比较时,应该使用 is

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

teechart绘制实时曲线_快速学会CAD绘制传输线路图纸

一工具CAD工程设计软件二方法和步骤万事开头难&#xff0c;遇到不懂的知识刚开始都有畏难的情绪&#xff0c;只要有决心学习&#xff0c;诚心想学会一项技能&#xff0c;那学会学好它就只是时间问题了。我们常常面临时间紧、需要快速入门甚至熟练地解决工作中实际情况的问题&am…

彝文计算机,试论计算机彝文字符编码的转换.pdf

试论计算机彝文字符编码的转换.pdf第17卷 第1期 云南民族大学学报(自然科学版) V01&#xff0e;17 No&#xff0e;12008年1月 Journal of Yunnan Nationalities University(Natural Sciences Edition) Jan&#xff0e;2o08试论计算机彝文字符编码的转换李金发(红河学院人文学院…

ActiveMQ(07):ActiveMQ结合Spring开发--建议

1、Camel框架支持大量的企业集成模式&#xff0c;可以大大简化集成组件间的大量服务和复杂的消息流。而Spring框架更注重简单性&#xff0c;仅仅支持基本的最佳实践。 2、Spring消息发送的核心架构是JmsTemplate&#xff0c;隔离了像打开、关闭Session和Producer的繁琐操作&…

使用ajax获取用户所在地的天气

1.要获取用户归属地的天气&#xff0c;首先得获取用户所在的市区&#xff0c; 这里先获取用户的IP&#xff0c;通过IP获取IP的归属地&#xff0c;从而得到用户 地址。 获取客户端ip: js: <scripttype"text/javascript" src"http://pv.sohu.com/cityjson?ieu…

Python 之协程

之前我们学习了线程、进程的概念&#xff0c;了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题&#xff0c;都要消耗一定的时间来创建进程、创建线…

ip变换器苹果系统_加密锁能为高铁做什么?铁路电力变换器系统告诉您

代表国之重器的高铁&#xff0c;是怎样保护他们在软件上投资的专有技术不被仿冒、逆向工程和篡改呢&#xff1f;与一般的软件保护加密不同&#xff0c;高铁运行中的实时控制器对物理环境有着严苛的要求&#xff0c;如铁路电力变换器系统&#xff0c;须满足典型工业应用的扩展温…

华为服务器ibmc怎么装系统,华为服务器安装操作系统

《华为服务器安装操作系统》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《华为服务器安装操作系统(11页珍藏版)》请在人人文库网上搜索。1、华为服务器安装操作系统 1把网线接到服务器管理口上&#xff0c;2288服务器管理口在服务器背后中下 部位置&#xff0c;有Mg…

英语面试(自我介绍,电话面试..)

大凡找工作的人&#xff0c;都有对面试的担心&#xff0c;而英语面试最令人头痛。面试气氛总是紧张的&#xff0c;一紧张就容易出错&#xff0c;中文“台词”都会结巴&#xff0c;何况英语&#xff01; 可俗话说&#xff0c;养兵千日&#xff0c;用兵一时&#xff0c;学了那么多…

服务端渲染与 Universal React App

随着 Webpack 等前端构建工具的普及&#xff0c;客户端渲染因为其构建方便&#xff0c;部署简单等方面的优势&#xff0c;逐渐成为了现代网站的主流渲染模式。而在刚刚发布的 React v16.0 中&#xff0c;改进后更为优秀的服务端渲染性能作为六大更新点之一&#xff0c;被 React…

zxing .net 多种条码格式的生成

下载地址&#xff1a;http://zxingnet.codeplex.com/ zxing.net是.net平台下编解条形码和二维码的工具&#xff0c;使用非常方便。 本文主要说明一下多种类型条码的生成。 适用的场景&#xff0c;标签可视化设计时&#xff0c;自定义条码类型&#xff0c;预览。 遍历zxing支持的…

k8s dashboard_windows10 部署 docker+k8s 集群

下面是经过踩坑之后的 windows10 单机部署 docker k8s 步骤&#xff0c;其中有几处比较关键的地方需要注意&#xff0c;后面加粗标注&#xff0c;下面就开始吧&#xff01;0、下载cmder在 windows 上有一个趁手的命令行工具非常有必要&#xff0c;推荐 Cmder&#xff0c;下面是…

Python 之网络编程基础

套接字&#xff08;socket&#xff09;初使用 基于TCP协议的socket tcp是基于链接的&#xff0c;必须先启动服务端&#xff0c;然后再启动客户端去链接服务端 server端 import socket sk socket.socket() sk.bind((127.0.0.1,8898)) # 把地址绑定到套接字 sk.listen() …

ajax on ture,细数Ajax请求中的async:false和async:true的差异

实例如下&#xff1a;function test(){var temp"00";$.ajax({async: false,type : "GET",url : userL_checkPhone.do,complete: function(msg){alert(complete);},success : function(data) {alert(success);tempdata;temp"aa";}});alert(temp);…

阿里云邮箱登录日志中有异地IP登录是怎么回事?该怎么办?

注意&#xff0c;请先到阿里云官网 领取幸运券&#xff0c;除了价格上有很多优惠外&#xff0c;还可以参与抽奖。详见&#xff1a;https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode2a7uv47d&utm_source2a7uv47d以下可能&#xff1a;1、您的邮…

面试之网络编程和并发

1、简述 OSI 七层协议。 物理层&#xff1a;主要基于电器特性发送高低电压(1、0)&#xff0c;设备有集线器、中继器、双绞线等&#xff0c;单位&#xff1a;bit 数据链路层&#xff1a;定义了电信号的分组方式&#xff0c;设备&#xff1a;交换机、网卡、网桥&#xff0c;单位&…

redis 远程主机强迫关闭了一个现有的连接_记一次Redis+Getshell经验分享

你是我患得患失的梦&#xff0c;我是你可有可无的人&#xff0c;毕竟这穿越山河的箭&#xff0c;刺的都是用情之疾的人。前言&#xff1a;当我们接到一个授权渗透测试的时候&#xff0c;常规漏洞如注入、文件上传等尝试无果后&#xff0c;扫描端口可能会发现意外收获。知己知彼…

无线连接 服务器,服务器无线远程连接

服务器无线远程连接 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。使用Mac版Microsoft Remote Desktop工具&#xff0c;远程连接W…

面试前您该做的事情

选自本人作品&#xff1a;《软件性能测试与LR实战》 无论您是刚刚毕业的大学生朋友&#xff0c;还是已经有工作经验的同行&#xff0c;大家都不可避免的面临一个问题就是找工作或者换工作的问题。在整个应聘过程中&#xff0c;面试无疑是最具有决定性意义的重要环节&#xff0c…

IO模型

IO模型介绍 传统的网络IO模型包括五种&#xff1a; blocking IO 阻塞IOnonblocking IO 非阻塞IOIO multiplexing IO多路复用signal driven IO 信号驱动IOasynchronous IO 异步IO 由于signal driven IO&#xff08;信号驱动IO&#xff09;在实际中…

重温数据结构:树 及 Java 实现(转)

转自&#xff1a;http://blog.csdn.net/u011240877/article/details/53193877 读完本文你将了解到&#xff1a; 什么是树树的相关术语 根节点父亲节点孩子节点叶子节点如上所述节点的度树的度节点的层次树的高度树的深度树的两种实现 数组表示链表表示的节点树的几种常见分类及…