# python # /usr/sbin/py/python # -*-coding:utf8-*- # pthon 反射 import abc class Person(metaclass=abc.ABCMeta): "定义接口" @abc.abstractmethod def run(self): pass class Student(Person): def __init__(self, name, age): self.name = name self.age = age def run(self): print("%s is running" % self.name) stu1 = Student("jake", 15) stu1.run() print(hasattr(stu1, "name")) # hasattr方法判断一个实例中是否含有某个属性值 print(getattr(stu1, "name")) # getattr方法获取一个实例中属性的直值 print(getattr(stu1, "securiteSkill", "没有秘技")) # 获取一个不存在属性,如果没有指定默认值则会报错 print(getattr(stu1, "run")) setattr(stu1, "securiteSkill", "独家秘技") # 给对象设置属性 print(stu1.securiteSkill) delattr(stu1, "securiteSkill") # 删除属性 如果不存在则会报错 # 导入模块补充 # __import__("moduleName") # 通过字符串导入模块,字符串不接受 a.b.c的分层,返回值只返回顶级对象 # from packageName.moduleNamee import * # 该种导入会导入模块中的方法,但python不会导入 _method 这种方法 # 但可用强制导入 from packageNmae.moduleName import _method # import importlib # t=importlib.import_module("a.b.t") # t.method() # 使用importlib模块用字符串进行导入可用实现直接导入模块,调用方法 print(Student.__dict__) # 并不是内置方法的全部 print(dir(Student)) # 获取全部的内置属性或方法 # ['__abstractmethods__', '__class__', '__delattr__', '__dict__', # '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', # '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', # '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', # '__setattr__', '__sizeof__', '__str__', # '__subclasshook__', '__weakref__', '_abc_impl', 'run'] class Teacher(Person): def __init__(self, name, age): self.name = name self.age = age def __getattr__(self, item): print("getattr方法被执行:----------------->", item) def __setattr__(self, key, value): print("setattr方法执行------------------------------>",key,value) self.__dict__[key] =value def run(self): print("%s is running" %self.name) teacher1 = Teacher("buluse", 50) # 生成实例时 setattr方法就会被执行 print(teacher1.abc) # 当调用不存在的属性值是 会出发 __getattr__方法 teacher1.skill = "weblogic" print(teacher1.name,teacher1.age)
python 22 类反射
最新推荐文章于 2021-07-23 15:03:07 发布