Python Day28
面对对象进阶:
1.反射
1 什么是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
hasattr
def hasattr(*args, **kwargs): # real signature unknown"""Return whether the object has an attribute with the given name.This is done by calling getattr(obj, name) and catching AttributeError."""passhasattr
getattr
def getattr(object, name, default=None): # known special case of getattr"""getattr(object, name[, default]) -> valueGet a named attribute from an object; getattr(x, 'y') is equivalent to x.y.When a default argument is given, it is returned when the attribute doesn'texist; without it, an exception is raised in that case."""passgetattr
setattr
def setattr(x, y, v): # real signature unknown; restored from __doc__"""Sets the named attribute on the given object to the specified value.setattr(x, 'y', v) is equivalent to ``x.y = v''"""passsetattr
delattr
def delattr(x, y): # real signature unknown; restored from __doc__"""Deletes the named attribute from the given object.delattr(x, 'y') is equivalent to ``del x.y''"""passdelattr
四个方法的使用演示
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)#检测是否含有某属性 print(hasattr(obj,'name')) print(hasattr(obj,'say_hi'))#获取属性 n=getattr(obj,'name') print(n) func=getattr(obj,'say_hi') func()print(getattr(obj,'aaaaaaaa','不存在啊')) #报错#设置属性 setattr(obj,'sb',True) setattr(obj,'show_name',lambda self:self.name+'sb') print(obj.__dict__) print(obj.show_name(obj))#删除属性 delattr(obj,'age') delattr(obj,'show_name') delattr(obj,'show_name111')#不存在,则报错print(obj.__dict__)四个方法的使用演示
类也是对象
class Foo(object):staticField = "old boy"def __init__(self):self.name = 'wupeiqi'def func(self):return 'func'@staticmethoddef bar():return 'bar'print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar')类也是对象
~__str__和__repr__
改变对象的字符串显示__str__,__repr__
自定制格式化字符串__format__
#_*_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)) print('from str: ',str(s1)) print(s1)''' str函数或者print函数--->obj.__str__() repr或者交互式解释器--->obj.__repr__() 如果__str__没有被定义,那么就会使用__repr__来代替输出 注意:这俩方法的返回值必须是字符串,否则抛出异常 ''' print(format(s1,'nat')) print(format(s1,'tna')) print(format(s1,'tan')) print(format(s1,'asfdasdffd'))
class B:def __str__(self):return 'str : class B'def __repr__(self):return 'repr : class B'b=B() print('%s'%b) print('%r'%b)%s和%r
~__del__
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
~__new__
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'):orig = super(Singleton, cls)cls._instance = orig.__new__(cls, *args, **kw)return 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 print(one is two)单例模式
~__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__
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__
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)
class Person:def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexdef __hash__(self):return hash(self.name+self.sex)def __eq__(self, other):if self.name == other.name and self.sex == other.sex:return Truep_lst = [] for i in range(84):p_lst.append(Person('egon',i,'male'))print(p_lst) print(set(p_lst))一道面试题
转载于:https://www.cnblogs.com/liuduo/p/7576906.html
Python Day28相关推荐
- pythonsocket自定义协议_小渣渣学习笔记 python day28【tcp聊天 udp聊天 粘包 自定义协议 struct模块】...
tcp 实现聊天功能 server端 import socket sk = socket.socket() sk.bind(('127.0.0.1',22000)) sk.listen() while ...
- python对象属性在引用时前面需要加()_python基础-面向对象进阶
实现授权的关键点就是覆盖__getattr__方法 1.通过触发__getattr__方法,找到read方法 示例1: 1 importtime2 classFileHandle:3 def __in ...
- 轩小陌的Python笔记-day28 索引、函数及存储过程
day28 索引和函数及存储过程 课程目标:了解 MySQL 中索引.函数.存储过程.函数.触发器.视图等知识点. 课程概要: 索引 函数 存储过程 视图 触发器 1. 索引 在数据库中索引最核心的作 ...
- Python学习 Day28 JS函数(二)
JS函数(二) (一)return关键字 关键字return一般结合函数一起使用.而且需要注意,这个关键字一般只能在函数体中使用 作用: 1.函数体中如果遇见关键字return,函数体后面语句不再执行 ...
- python中继承和组合的区别_Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类...
一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...
- Python高级全栈开发实战 老男孩课程S16+路飞学城项目+女神串讲 Python全栈直通车课程
python高级全栈开发实战 老男孩课程S16+路飞学城项目+女神串讲 Python全栈直通车课程 Python高级全栈开发实战老男孩课程,是可以帮助同学们从零基础开始到项目开发实战的全栈课程,内容非 ...
- 路飞学城python全栈开发_[Python] 老男孩路飞学城Python全栈开发重点班 骑士计划最新100G...
简介 老男孩&路飞学城Python全栈开发重点班课程,作为Python全栈教学系列的重头戏,投入了全新的课程研发和教学精力,也是Python骑士计划的核心教学,由ALEX老师开班镇守,一线技术 ...
- 老男孩22期python视频_老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量...
day01 Python的简介 环境安装 变量 数据类型等 4月27日 周六 day02 While循环等 4月28日 周天 day03 数据类型 for循环 4月29日 周一 day04 列表 数组 ...
- python全栈开发百度云_老男孩2020最新Python全栈开发基础班+就业班
|- 数据结构+算法.rar - 485.30 MB |- 串讲.rar - 2.01 GB |- 补充资料.rar - 536.00 MB |- MongoDB.rar - 110.10 MB |- ...
最新文章
- Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
- 【跃迁之路】【707天】程序员高效学习方法论探索系列(实验阶段464-2019.1.28)...
- 【动态规划】装箱问题
- golang error类型详解
- python爬虫流程-Python:爬虫处理流程及网页解析
- VMWare ubuntu虚拟机异常关闭打开报错:该虚拟机似乎正在使用中(下班虚拟机最好关闭,免得又异常关闭导致问题)(千万别在虚拟机下win+L锁屏,解锁后就打不开虚拟机了)
- 《编程匠艺》读书笔记之四
- Pytorch教程(十三):reshape、squeeze、flatten
- gSOAP中内存的使用
- Taro+react开发(7)--控制跳转
- JavaScript中关于创建对象的笔记
- OSChina 周五乱弹 —— 你用学习机来搞学习?
- bzoj 3379: [Usaco2004 Open]Turning in Homework 交作业(区间DP)
- AngularJS Provider/Service/Factory 使用
- java中io流浅析
- Windows程序设计(5):移动窗口、调整窗口大小
- python处理skl参数、ubuntu下翻译选中文字
- Photoshop Elements 2023(PSE简化版2023) 支持win/mac版
- CodeForces - 1324D Pair of Topics(二分或双指针)
- 列表xcode项目下所有的lnfo.plist