python-反射

本文深入探讨了Python中的反射机制,包括使用isinstance和issubclass进行类型检查,以及如何利用getattr和setattr动态地访问和修改对象的属性和方法。同时,文章还介绍了如何通过反射操作类、模块的属性和方法,以及反射在安全性方面的考量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# isinstance
# issubclass
class A:pass


class B(A):pass


a = A()
print(isinstance(a, A))  # 就是判断a对象是不是A类的对象  True
print(issubclass(B, A))  # 判断B是不是A的子类,子类要写在前面 True

反射 : 是用字符串类型的 名字去操作变量 ,没有安全隐患

name = 1
eval("print(name)") 
# eval() 也能实现 , 但是eval()有安全隐患
# 反射对象中的属性和方法

class A:
    def func(self):
        print('in func')


a =A()
a.name = 'alex'
ret = getattr(a, 'name')   # 通过字符串的形式取到的值
print(ret)

# 反射对象的属性
变量名 = input('>>>')
if 变量名 == 'name':
    print(getattr(a, 'name'))

反射对象的方法
ret2 = getattr(a, 'func')   # 拿到的是一个地址
ret2()  # 加上括号才是执行
class A:
    price = 30  # 静态属性 
    @classmethod
    def func(self):
        print('in func')


# 反射类的属性
print(getattr(A, 'price'))

# 反射类的方法(classmethod staticmethod)
if hasattr(A, 'func'):
    ret = getattr(A, 'func')
    ret()

写一个my.py,代码如下

day = 'Tuesday'
def wahaha():
    print('hahahaha')

class C:
    pass

导入my.py

import my

# 反射模块的属性
print(my.day)
print(getattr(my,'day'))

# 反射模块的方法
ret = getattr(my, 'wahaha')
ret()

# 内置模块也能用
def qqxing():
    print('QQ星')
    
year = 2019

import sys

print(sys.modules)
print(sys.modules['__main__'].year)

# 反射自己模块中的变量
print(getattr(sys.modules['__main__'], 'year'))  
# 如果自己这个模块变成了另一个模块导入的对象的话 这样写就会出错

# 反射自己模块中的函数
ret = getattr(sys.modules['__main__'], 'qqxing')
ret()

变量名 = input('>>>')
print(getattr(sys.modules[__name__], 变量名))  # 用这个不会报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值