本文实例讲述了Python反射和内置方法重写操作。分享给大家供大家参考,具体如下:
isinstance和issubclass
isinstance(obj,cls)
检查是否obj是否是类 cls 的对象,类似 type()
class Foo(object):
pass
obj = Foo()
isinstance(obj, Foo)
issubclass(sub, super)
检查sub类是否是 super
类的派生类
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(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']=18
f1['age1']=19
del f1.age1
del 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.obj
a = 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__
运行输出:
call
len
class A:
def __init__(self):
self.a = 1
self.b = 2
def __len__(self):
return len(self.__dict__)
a = A()
print(len(a))
运行结果:
2
hash
class A:
def __init__(self):
self.a = 1
self.b = 2
def __hash__(self):
return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))
运行结果:
-1777982230
eq
class A:
def __init__(self):
self.a = 1
self.b = 2
def __eq__(self,obj):
if self.a == obj.a and self.b == obj.b:
return True
a = A()
b = A()
print(a == b)
运行结果:
True
合并名字性别一样的人:
class Person:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __hash__(self):
return hash(self.name+self.sex)
def __eq__(self, other):
if self.name == other.name and self.sex == other.sex:return True
p_lst = []
for i in range(84):
p_lst.append(Person('egon',i,'male'))
print(p_lst)
print(set(p_lst))
运行结果:
[<main.Person object at 0x01425AB0>, <main.Person object at 0x01425AD0>, <main.Person object at 0x01425AF0>, <main.Person object at 0x01425910>, <main.Person object at 0x014258D0>, <main.Person object at 0x01425950>, <main.Person object at 0x01425970>,
<main.Person object at 0x014259D0>, <main.Person object at 0x01425C70>, <main.Person object at 0x01425890>, <main.Person object at 0x01425B30>, <main.Person object at 0x01425BB0>, <main.Person object at 0x01425C30>, <main.Person object at 0x01429710>,
<main.Person object at 0x01429730>, <main.Person object at 0x014298F0>, <main.Person object at 0x01429910>, <main.Person object at 0x01429930>, <main.Person object at 0x01429950>, <main.Person object at 0x01429970>, <main.Person object at 0x01429990>,
<main.Person object at 0x014299B0>, <main.Person object at 0x014299D0>, <main.Person object at 0x014299F0>, <main.Person object at 0x01429A10>, <main.Person object at 0x01429A30>, <main.Person object at 0x01429A50>, <main.Person object at 0x01429A70>,
<main.Person object at 0x01429A90>, <main.Person object at 0x01429AB0>, <main.Person object at 0x01429AD0>, <main.Person object at 0x01429AF0>, <main.Person object at 0x01429B10>, <main.Person object at 0x01429B30>, <main.Person object at 0x01429B50>,
<main.Person object at 0x01429B70>, <main.Person object at 0x01429B90>, <main.Person object at 0x01429BB0>, <main.Person object at 0x01429BD0>, <main.Person object at 0x01429BF0>, <main.Person object at 0x01429C10>, <main.Person object at 0x01429C30>,
<main.Person object at 0x01429C50>, <main.Person object at 0x01429C70>, <main.Person object at 0x01429C90>, <main.Person object at 0x01429CB0>, <main.Person object at 0x01429CD0>, <main.Person object at 0x01429CF0>, <main.Person object at 0x01429D10>,
<main.Person object at 0x01429D30>, <main.Person object at 0x01429D50>, <main.Person object at 0x01429D70>, <main.Person object at 0x01429D90>, <main.Person object at 0x01429DB0>, <main.Person object at 0x01429DD0>, <main.Person object at 0x01429DF0>,
<main.Person object at 0x01429E10>, <main.Person object at 0x01429E30>, <main.Person object at 0x01429E50>, <main.Person object at 0x01429E70>, <main.Person object at 0x01429E90>, <main.Person object at 0x01429EB0>, <main.Person object at 0x01429ED0>,
<main.Person object at 0x01429EF0>, <main.Person object at 0x01429F10>, <main.Person object at 0x01429F30>, <main.Person object at 0x01429F50>, <main.Person object at 0x01429F70>, <main.Person object at 0x01429F90>, <main.Person object at 0x01429FB0>,
<main.Person object at 0x01429FD0>, <main.Person object at 0x01429FF0>, <main.Person object at 0x01751030>, <main.Person object at 0x01751050>, <main.Person object at 0x01751070>, <main.Person object at 0x01751090>, <main.Person object at 0x017510B0>,
<main.Person object at 0x017510D0>, <main.Person object at 0x017510F0>, <main.Person object at 0x01751110>, <main.Person object at 0x01751130>, <main.Person object at 0x01751150>, <main.Person object at 0x01751170>, <main.Person object at 0x01751190>]
{<main.Person object at 0x01425AB0>}