# 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 类反射
最新推荐文章于 2024-05-02 23:37:30 发布
164

被折叠的 条评论
为什么被折叠?



