【python】反射和动态加载-创新互联
1、概念理解
网站名称:【python】反射和动态加载-创新互联
网页URL:http://ybzwz.com/article/ccojsd.html
反射: 可以把字符串
映射到实例的变量或者实例的方法
然后可以去执行调用、修改等操作,主要干了四件事:
(1)查看对象属性在不在
(2)获取对象属性
(3)设置对象属性
(4)删除对象属性
这是对对象自身的一些处理。
动态加载:常用的方法就是importlib.import_module,程序中 用到包的时候才会把包导入进来,这是对外部包的处理。
2. 代码实现 2.1 反射自定义一个类
from typing import Optional
class Atiaisi():
def __init__(self):
self.name = "atiais"
self.sex = "male"
self.height = '190'
self.weight = '75'
def speak(self, msg: Optional[str] = 'nothing'):
print(f"{self.name} say: {msg}")
def run(self):
print("huuuuuuuuuuuuuuuuu")
a = Atiaisi()
2.1.1hasattr
: 查看类中的属性是否存在,存在返回True,不存在返回Falsebool_name = hasattr(a, 'name')
print("对象中是否有name属性: ", bool_name)
bool_speak = hasattr(a, 'speak')
print("对象中是否有speak属性: ", bool_speak)
bool_speak111111 = hasattr(a, 'speak111111')
print("对象中是否有speak111111属性: ", bool_speak111111)
运行结果:
getattr
: 获取类的属性name = getattr(a, 'name')
print("获取对象中的name值: ", name)
speak = getattr(a, 'speak')
print("获取对象中的speak值: ", speak)
speak("hello everyone!")
运行结果:
setattr
: 设置类的属性setattr(a, "name", "ATIAISI")
a.speak('come on!')
setattr(a, "age", 18)
print("对象属性:", a.__dict__)
运行结果:
delattr
: 删除类的属性delattr(a, 'sex')
print("查看对象属性:", a.__dict__)
delattr(a, 'name')
print("再次查看对象属性:", a.__dict__)
print("查看对象的name属性还在不在:", a.name)
运行结果:
从运行结果可以看出,当删掉实例属性之后再调用会发生属性不存在报错。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import importlib
a = importlib.import_module('02_URL标准化.02_StandardizedURL')
print(a.standard_url('http://1.1.1.1//1111111'))
b = importlib.import_module('.02_StandardizedURL', package='02_URL标准化')
print(a.standard_url('http://1.1.1.1//2222222'))
运行结果:
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站名称:【python】反射和动态加载-创新互联
网页URL:http://ybzwz.com/article/ccojsd.html