python元类、反射及双线方法
元类
print(type('abc'))
print(type(True))
print(type(100))
print(type([1, 2, 3]))
print(type({'name': '太白金星'}))
print(type((1,2,3)))
print(type(object))class A:passprint(isinstance(object,type))
print(isinstance(A, type))
type元类是获取该对象从属于的类,而type类比较特殊,Python原则是:一切皆对象,其实类也可以理解为’对象’,而type元类又称作构建类,python中大多数内置的类(包括object)以及自己定义的类,都是由type元类创造的。
而type类与object类之间的关系比较独特:object是type类的实例,而type类是object类的子类,这种关系比较神奇无法使用python的代码表述,因为定义其中一个之前另一个必须存在。所以这个只作为了解。
反射
反射是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
反射中常用的四个函数:
class Student:f = '类的静态变量'def __init__(self,name,age):self.name=nameself.age=agedef say_hi(self):print('hi,%s'%self.name)
obj=Student('alex',16)
hasatter 检测是否含有某属性,方法
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))结果:
True
True
获取属性,方法 # 获取不到直接报错
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')
func()结果:
'alex'
'hi,alex'
设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))结果:
{'name': 'alex', 'age': 16, 'sb': True, 'show_name': <function <lambda> at 0x00000180E591BB70>}
alexsb
删除属性
delattr(obj,'age')
# delattr(obj,'show_name')
# delattr(obj,'show_name111')#不存在,则报错print(obj.__dict__)结果:
{'name': 'alex'}
对类的反射:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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'))
# 结果:
old boy
<function Foo.func at 0x00000212D21FBC80> # 获取func对象方法地址
<function Foo.bar at 0x00000212D21FBD08> # 获取bar静态方法地址
对当前模块的反射:
import sysdef s1():print('s1')def s2():print('s2') this_module = sys.modules[__name__]print(hasattr(this_module, 's1'))
print(getattr(this_module, 's2'))# 结果:
True
<function s2 at 0x000002000247BBF8>
对其他模块的反射:
import time
print(hasattr(time,'ctime'))
print(getattr(time,'ctime'))
print(getattr(time,'ctime')())# 结果:
True
<built-in function ctime>
'Fri Aug 9 08:12:54 2019'
反射的应用
# 没学反射之前的解决方式:
class User:def login(self):print('欢迎来到登录页面')def register(self):print('欢迎来到注册页面')def save(self):print('欢迎来到存储页面')while 1:choose = input('>>>').strip()if choose == 'login':obj = User()obj.login()elif choose == 'register':obj = User()obj.register()elif choose == 'save':obj = User()obj.save()# 学了反射之后解决方式
class User:def login(self):print('欢迎来到登录页面')def register(self):print('欢迎来到注册页面')def save(self):print('欢迎来到存储页面')user = User()
while 1:choose = input('>>>').strip()if hasattr(user,choose):func = getattr(user,choose)func()else:print('输入错误。。。。')
函数和方法的区别
通过打印函数(方法)名确定
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():passprint(func) # <function func at 0x00000260A2E690D0>class A:def func(self):passprint(A.func) # <function A.func at 0x0000026E65AE9C80>
obj = A()
print(obj.func) # <bound method A.func of <__main__.A object at 0x00000230BAD4C9E8>>
通过types模块验证
from types import FunctionType
from types import MethodTypedef func():passclass A:def func(self):passobj = A()
print(isinstance(func,FunctionType)) # True
print(isinstance(A.func,FunctionType)) # True
print(isinstance(obj.func,FunctionType)) # False
print(isinstance(obj.func,MethodType)) # True
静态方法是函数
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from types import FunctionType
from types import MethodTypeclass A:def func(self):pass @classmethoddef func1(self):pass @staticmethoddef func2(self):pass
obj = A()# 静态方法其实是函数
print(isinstance(A.func2,FunctionType)) # True
print(isinstance(obj.func2,FunctionType)) # True
函数和方法的几点区别:
(1)函数的是显性传参的,方法是隐性传参的。
(2)函数则跟对象无关。
(3)方法可以操作类内部的数据。
(4)方法跟对象是关联的。
双线方法
定义:双下方法是特殊方法,他是解释器提供的 由双下划线加方法名加双下划线 __方法名__
的具有特殊意义的方法,双下方法主要是python源码程序员使用的,在开发中尽量不要使用双下方法,熟知双下划线方法有助于我们研究源码
1、__len__
class B:def __len__(self):print(666)b = B()
len(b) # len 一个对象就会触发 __len__方法。class A:def __init__(self):self.a = 1self.b = 2def __len__(self):return len(self.__dict__)
a = A()
print(len(a))
2、_hash_
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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))
3、_str_
如果一个类中定义了__str__
方法,那么在打印 对象 时,默认输出该方法的返回值。
class A:def __init__(self):passdef __str__(self):return '太白'
a = A()
print(a)
print('%s' % a)
4、_repr_
如果一个类中定义了__repr__
方法,那么在repr(对象) 时,默认输出该方法的返回值。
class A:def __init__(self):passdef __repr__(self):return '太白'
a = A()
print(repr(a))
print('%r'%a)
5、_call_
对象后面加括号,触发执行。
注:构造方法__new__
的执行是由创建对象触发的,即:对象 = 类名() ;而对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo() # 执行 __init__
obj() # 执行 __call__
6、_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)
7、_del_
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
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)
8、_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)
单例模式:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A:__instance = Nonedef __new__(cls, *args, **kwargs):if cls.__instance is None:obj = object.__new__(cls)cls.__instance = objreturn cls.__instance
9、 __item__
系列
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['age1']=19
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)
10 上下文管理器相关
__enter__ __exit__
# 如果想要对一个类的对象进行with as 的操作 不行。
class A:def __init__(self, text):self.text = textwith A('大爷') as f1:print(f1.text)class A:def __init__(self, text):self.text = textdef __enter__(self): # 开启上下文管理器对象时触发此方法self.text = self.text + '您来啦'return self # 将实例化的对象返回f1def __exit__(self, exc_type, exc_val, exc_tb): # 执行完上下文管理器对象f1时触发此方法self.text = self.text + '这就走啦'with A('大爷') as f1:print(f1.text)
print(f1.text)
自定义文件管理器
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Diycontextor:def __init__(self,name,mode):self.name = nameself.mode = modedef __enter__(self):print("Hi enter here!!")self.filehander = open(self.name,self.mode)return self.filehanderdef __exit__(self,*para):print("Hi exit here")self.filehander.close()with Diycontextor('py_ana.py','r') as f:for i in f:print(i)
python元类、反射及双线方法相关推荐
- Python 第二十六章 面向对象 元类+反射+双下方法
元类 class A:pass obj = A() print(type('abc')) print(type([1,2,3])) print(type((22,33)))# type 获取对象从属于 ...
- python 元类工厂模式_Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- python元类 orm_python-进阶-元类在ORM上的应用详解
ORM全称"Object Relational Mapping",即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作S ...
- 如何创建你的第一个Python元类?
Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一.通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类.本文介绍 ...
- python元类的简单了解
一.什么是元类? 在python中一切皆对象,那么类是否也是对象呢?通过class关键字产生的类的实例,我们已经很熟悉了,但是通过class关键字产生的类的类就是元类. class Bar:passb ...
- python元类_python中的元类 metaclass
python中的元类 metaclass 在python中,类(class)本身也是一个实例对象, 它的类型则是元类, 如果没有指明, 则自定义类的类型是type. 换言之, 我们所定义的普通类都是t ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- python 元类的call_通过 python的 __call__ 函数与元类 实现单例模式
简单一句话,当一个类实现__call__方法时,这个类的实例就会变成可调用对象. 直接上测试代码 classClassA:def __call__(self, *args, **kwargs):pri ...
- Python元类详解
文章目录 Python元类详解 Python谜团 元类的本质 调用一个类时发生了什么 再探元类 自定义元类 彩蛋:跳过python解释器 Python元类详解 元类比99%的用户所担心的魔法要更深,如 ...
- 深入理解Python元类(原创)
同样效果的代码: def __init__(cls,cls_name,cls_bases,cls_dict):type.__init__(cls,cls_name,cls_bases,cls_dict ...
最新文章
- 微信 服务器地址的有效性,C# 微 信 公众平台 验证服务器地址的有效性
- 谈谈让你纠结的年终奖
- Java was started but returned exit code=13
- python目标检测答案_你好,这里有一份2019年目标检测指南
- micro/protoc-gen-micro 不见了
- java责任链设计模式 订单_Java责任链设计模式实例分析
- android aptx固件,新增aptX蓝牙发射协议,M5固件首次升级!
- 解决Ajax中的缓存问题
- linux下gdb的简单使用
- 云图说|知道吗?在和你对话的那头,也许是个机器人哦~
- 解决Vscode编辑器不能打开多标签页问题
- 硬件超车无法掩盖生态缺失,软实力构建任重而道远 | 中科曙光高性能计算专访...
- Java编程练习题(涉及循环,函数等)
- 用you-get下载JayChou专辑
- 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...
- 工作中PUSH用到的统计命令
- MySQL原理与实践(一):一条select语句引出Server层和存储引擎层
- 关于公司备份软件选型
- ViewUI高保真 原型元件库操作指南
- 短视频脚本怎么写?6个套路
热门文章
- Python中super()和__init__()方法
- groovy --不注意的小错误(java.lang.String.positive() is applicable)
- Linux中常用C/C++一些头文件的作用
- 设计模式原则篇:(1)单一职责原则--Single Responsibility Principle
- 【QM-04】Inspection Characteristic(检验特征)
- VA02修改销售订单的BAPI举例
- Modify批量处理优化
- SAP中如何更改供应商账户组
- 对于ACCESS跨库的一些研究
- SAP MM 移动类型-入门篇