首页 > 编程 > Python > 正文

Python反射和内置方法重写操作详解

2020-02-15 22:49:22
字体:
来源:转载
供稿:网友

本文实例讲述了Python反射和内置方法重写操作。分享给大家供大家参考,具体如下:

isinstance和issubclass

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

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

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

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

反射

1 什么是反射

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

四个反射函数

hasattr(obj,str)
检测是否含有某属性

getattr(obj,str)
获取属性,不存在报错

setattr(obj,str,value)
设置属性

delattr(obj,str)
删除属性,不存在报错

导入其他模块,利用反射查找该模块是否存在某个方法

def test(): print('from the test')

item系列

__getitem__/__setitem__/__delitem__

class Foo: def __init__(self,name):  self.name=name def __getitem__(self, item):  print(self.__dict__[item]) def __setitem__(self, key, value):  self.__dict__[key]=value def __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']=18f1['age1']=19del f1.age1del f1['age']f1['name']='alex'print(f1.__dict__)

运行结果:

del obj.key时,我执行
del obj[key]时,我执行
{'name': 'alex'}

__new__

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

运行结果:

in new function
in init function
1

单例模式:

class A: def __new__(cls):  if not hasattr(cls,'obj'):   cls.obj = object.__new__(cls)  return cls.obja = A()b = A()print(a is b)

运行结果:

True

__call__

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

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

class Foo: def __init__(self):  pass def __call__(self, *args, **kwargs):  print('__call__')obj = Foo() # 执行 __init__obj()  # 执行 __call__            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表