python 22 类反射

# 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值