反射

反射

所谓反射,是指程序可以访问、检测和修改它本身状态或者行为的一种能力(自身)

在Python中,面向对象中的反射是指通过字符串的形式操作对象的相关属性。

四个可以实现自省的函数

attribute

  • hasattr
    • hasattr(*args,**kwargs)
  • getattr
    • getattr(obj,name,default=None)
  • setattr
  • delattr
class Foo:
	f="类的静态变量"
	def __init__(self,name,age):
		self.name=name
		self.age=age

	def say(self):
		print("Hello,%s"%self.name)

obj=Foo("Tom",22)
# #检测是否含有某个属性
# print(hasattr(obj,'name'))
# print(hasattr(obj,'say'))
# #获取属性
# gt=getattr(obj,'name')
# print(gt)
# gtf=getattr(obj,'say')
# gtf()
# gtf1=getattr(obj,'hello')#不存在报错
# print(obj.__dict__)
#设置属性
setattr(obj,'good man',True)
setattr(obj,'show_name',lambda self:self.name+'good man')
print(obj.__dict__)
print(obj.show_name(obj))
#删除属性
delattr(obj,'show_name')
print(obj.__dict__)

联想,字符串,列表元组可以通过索引值引用值,字典可以通过关键字引用值,用了[]

item系列

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)


obj1=Foo('Tom')
obj1['age']=18
obj1['age1']=19
print(obj1.__dict__)
del obj1['age']
del obj1.age1

__del__

析构方法,当对象在内存中被释放,就会自动触发执行。

一般不需要自定义。

因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:
	def __del__(self):
		print("执行Del函数了")

obj=Foo()
del obj
#执行了Del函数

__str__

  • 如果直接print打印对象,会看到创建对象的内存地址。
  • 当我们使用print(XXX)时,输出对象,如果定义了__str__方法,就会打印该方法return的信息描述。
class Cat:
	def __init__(self,new_name,new_age):
		self.name=new_name
		self.age=new_age

	def __str__(self):
		return "名字是:%s,年龄是:%s"%(self.name,self.age)

obj=Cat("Tom",3)
print(obj)
#名字是:Tom,年龄是:3

首先__Call__方法

def func():
	print("Hello")

func()
print(func())
#调用--->call--->啥啥啥的不能called

对应的,类实例对象的调用,需要使用到__call__特殊方法

class Student:
	def __init__(self,name):
		self.name=name

	def __call__(self,son):
		print("我的名字是%s,我的儿子是%s"%(self.name,son))

stu=Student("丁义阔")
stu("王科涵")
#我的名字是丁义阔,我的儿子是王科涵

#用类实现装饰器

#通过`__init__`和`__call__`方法实现
class Test:

	def __init__(self,func):
		print("装饰器准备装饰")
		self.__func=func

	def __call__(self,*args,**kwargs):
		print("Wrapper Context.")
		print("Before")
		self.__func(*args,**kwargs)
		print("After")

@Test
def show():
	print("Hello")
	pass
print("flag")
show()


装饰器准备装饰
flag
Wrapper Context.
Before
Hello
After
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值