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

Python 面向对象之双下方法,内置函数相关推荐

  1. Python面向对象反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  2. python学习之最常用的内置函数

    python学习之最常用的内置函数 Python 内置函数总共有70余个(通常把内置类也统称为内置函数),覆盖面广,功能强大.不过,对于初学者在初级阶段,掌握下面几个函数是当务之急. (1) 控制台输 ...

  3. Python培训教程:Python有哪些比较重要的内置函数?

    学习Python技术或者参加Python工作的小伙伴们应该都知道,在Python编程语言中会经常出现很多内置函数,很少有人清楚这些函数,但是它的功能是不可小觑的,下面小编就为大家详细介绍一下Pytho ...

  4. Python中10个常用的内置函数

    大家好,我是小张 在 3.8 版本中,Python 解释器共有近 69 个内置函数可供使用,有了它们能极大地提高编码效率, 数量虽然不少,但在日常搬砖中只用到其中一部分,根据使用频率和用法,列出来几个 ...

  5. python常用内置函数乘法_每个 Python 高手都应该知道的内置函数

    每个 Python 高手都应该知道的内置函数 Python 将纳入高中教材,大学 VB 将被 Python 取代, 现在你还对 Python 一无所知吗?去年就被国外一机构预测, 2017 年 pyt ...

  6. python之路-双下方法

    双下方法 定义: 双下方法是特殊方法,他是解释器提供的,由双下线加方法名加双下划线 __方法名__具有特殊意义的方法 双下方法主要是Python源码程序员使用的,元编程 我们在开发中尽量不要使用双下方 ...

  7. 十八.面向对象编程,__init__方法,内置函数

    学习python第18天 一.面向对象编程 面向过程编程与面向对象编程 对象是数据与功能的集合体,而类则是对象之间相同数据与功能的集合体 类与对象 二. __init__方法 选课案例改进1: 选课案 ...

  8. Python装饰器、生成器、内置函数、Json-Day05

    装饰器 装饰器本质上就是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理 ...

  9. python hashlib安装_Hashlib加密,内置函数,安装操作数据库

    hashlib模块的md5加密: md5同样的内容加密后是一样的 md5加密后是不可逆的.即能加密,没办法解密. 撞库: 只是针对简单的,因为同样的内容加密后是一样的,难一点就不行了. 登录密码:注册 ...

最新文章

  1. AI视频行为分析系统项目复盘——技术篇3:tensorRT技术梳理
  2. 看懂SQL Server的查询计划(绝对好文!)
  3. 将一张表里的数据转换为json字符串
  4. pci总线定时协议_汽车总线测试的“解忧杂货店”
  5. 肝了一个月,终于搞到了 30 页的 Python 进阶面试题
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (9) - 流水线前端/微指令队列循环流侦测器LSD
  7. python thread 共享数据
  8. ALL-TAG推出RFID墨水防损标签
  9. 《Java遗传算法编程》—— 1.8 参数
  10. 计算机应用中级职称报告,中级工程师职称总结
  11. 联想笔记本修复计算机还原系统失败,联想笔记本电脑重装系统不成功,联想笔记本系统恢复...
  12. 计算机网络期末复习要点(谢希仁第8版)抱佛脚通用
  13. python地震数据处理_Python爬虫之实时地震数据
  14. python程序设计总结报告_把PPT 总结报告上传
  15. ADSL拨号上网和宽带上网有什么区别?
  16. #CSDN软件工程师能力认证学习精选# NoSql是什么?
  17. 大数据学习总结(2021版)---Mysql基础
  18. 考研英语(一、二)应用文(小作文)写作模板—中公考研
  19. zzuli OJ 1127: 矩阵乘积
  20. 力扣——374. 猜数字大小(java)

热门文章

  1. 多线程读取文件File
  2. 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题
  3. @RequiresPermissions 注解说明
  4. tr069相关协议说明
  5. MessageBox 弹框
  6. 【bzoj 2434】【codevs 1946】[Noi2011]阿狸的打字机(AC自动机)
  7. python 代码片段9
  8. Distinct源码分析
  9. Windows Phone 8初学者开发—第7部分:本地化应用程序
  10. js操作json数据的一些感受