python 反射机制

什么是反射?

  • 在运行时获取对象的类型,属性,和类当中的成员信息.等信息称之为反射,也叫自省. 简单点说可以那镜子来比喻反射,通过反射就可以检测修改本身

python反射操作的方法

  • getattr(obj, str)
    • 通过对象获取指定str(属性)的值
	class Point():  
    	def __init__(self, x, y):
	        self.x = x 
	        self.y = y 
			
	print(getattr(Point(1,2), "x")) # 等价于
	print(Point(1,2).x) # 1
	print(getattr(Point(1,2), "z")) # 等价于
	print(Point(1,2).z) # 抛出异常,not attribute z
  • setattr(obj, str, val)
    • 通过对象修改指定或者创建str的值
# 
class Point():  
    def __init__(self, x, y):
        self.x = x 
        self.y = y 
  
p = Point(1,2)   # 创建对象p当中的xy分别为1,2
setattr(p, "x", 10)  # 将对象p当中的属性x值改为10
print(getattr(p, "x")) # 10
setattr(p, "z", 11) # 由于对象没有z属性,所以会直接创建z属性,值为11
print(getattr(p, "z")) # 11
  • hasattr(obj, str)
    • 判断对象是否具有str属性
class Point():  
    def __init__(self, x, y):
        self.x = x 
        self.y = y 
    
    def add(self, __o):
        return Point(self.x + __o.x,self.y + __o.y)
class Point():  
    def __init__(self, x, y):
        self.x = x 
        self.y = y 
    
    def add(self, __o):
        return Point(self.x + __o.x,self.y + __o.y)
    
p = Point(1,2)    
print(hasattr(p, "add")) # True
print(hasattr(p, "sub")) # False

小案例

class Point():  
    def __init__(self, x, y):
        self.x = x 
        self.y = y 
        

    def show(self):  
        return "<Point {},{}>".format(self.x, self.y)
    
    # def __add__(self, __o):
    #     return Point(self.x + __o.x, self.y + __o.y)
    
    def add(self, __o):
        return Point(self.x + __o.x, self.y + __o.y)
    
     __repr__ = show  # 间接访问对象
    
    
p1 = Point(1, 2)
p2 = Point(0, 4)
# p3 = p1.add(p2)  
if not hasattr(Point, "__add__"): # 类属性,在动态绑定方法之后,可以通过.运算符和该类的实例访问,都有绑定的效果
    setattr(Point, "__add__", lambda self, other:Point(self.x + other.x, self.y + other.y))
p3 = p1 + p2

# 注意这里是给p1实例绑定了方法,p2并没有此方法
if not hasattr(p1, "sub"): # 实例属性没有绑定效果
    setattr(p1, "sub", lambda self, other:Point(self.x - other.x, self.y - other.y))
# print(getattr(p1, "sub")(p2))
print(p1.sub(p2)) # 将方法绑定在实例上,使用该类的对象调用的时候没有绑定效果
# print(p1.sub)
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值