面向对象的反射和其他

1.issubclass/type/isinstance/

class Base(object):
    pass
class Foo(Base):
    pass
class Bar(Foo):
    pass
#   issubclass  判断是否是继承关系,
print(issubclass(Bar, Base))     #判断第一个参数是不是第二个参数的子孙类
print(issubclass(Foo, Bar))
issubclass
class Foo(object):
    pass
obj = Foo()
print(obj, type(obj))   #获取当前对象是由那个类创建的
if type(obj) == Foo:
    print('obj是类Foo创建的对象')
结果:
<__main__.Foo object at 0x032ADCF0> <class '__main__.Foo'>
obj是类Foo创建的对象

class Foo(object):
    pass
class Bar(object):
    pass
def func(*args):
    foo_counter = 0
    bar_counter = 0
    for item in args:
        if type(item) == Foo:
            foo_counter += 1
        elif type(item) == Bar:
            bar_counter += 1
    return foo_counter, bar_counter
result = func(Foo(), Bar(), Foo())
print(result)
v1, v2 = func(Foo(), Bar(), Foo())
print(v1, v2)
结果:
(2, 1)
2 1
type
#isinstance  传两个参数,判断第一个参数(对象)是否是第二个参数(类及父类)的实例
class Base(object):
    pass
class Foo(Base):
    pass
obj1 = Foo()
print(isinstance(obj1, Foo))    #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
print(isinstance(obj1, Base))   #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
obj2 = Base()
print(isinstance(obj2, Foo))    #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
print(isinstance(obj2, Base))   #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
isinstance

  使用场景:type和isinstance

    type: 判断对象是不是由某一个指定的类创建    -->type(obj) == Foo

    isinstance:判断对象是不是由某一个指定的类或其父类创建  -->isinstance(obj,Foo)

2.方法和函数

  称谓:

    类  方法

    外  函数

   判断到底是方法还是函数的方法,看怎么调用

      对象.xxx  --> xxx就是方法

      类.xxx      --> xxx就是函数

      xxx   --> xxx就是函数

   打印查看

      function  函数

      method  方法

from types import MethodType,FunctionType
def check(args):
    if isinstance(args, MethodType):
        print('args是一个方法')
    elif isinstance(args, FunctionType):
        print('args是一个函数')
    else:
        print('不知道是什么东西')

def func():
    pass
class Foo(object):
    def detail(self):
        pass
    @staticmethod
    def xxx():
        pass

check(func)

obj = Foo()
check(obj.detail)
check(obj.xxx)
结果:
args是一个函数
args是一个方法
args是一个函数
导入types模块判断
class Foo(object):
    def f1(self):
        pass
    def f2(self):
        pass
    def f3(self):
        pass
obj = Foo()
print(obj.f1)
print(obj.f2)

obj = Foo()
Foo.f1(obj)     #把f1当做函数
obj = Foo()
obj.f1()        #把f1当做方法,自动传self值
结果:
<bound method Foo.f1 of <__main__.Foo object at 0x0030FDF0>>
<bound method Foo.f2 of <__main__.Foo object at 0x0030FDF0>>
打印查看

3.反射

  getatter  #根据字符串的形式,去对象中找成员

  hasatter  #根据字符串的形式,判断对象中是否含有成员

  setatter  #根据字符串的形式,动态的设置一个成员(添加在内存中)

  delatter  #根据字符串的形式,动态的删除一个成员(在内存中删除)

from types import FunctionType
import handler
while True:
    print('''
    系统支持的函数有:
    1. f1
    2. f2
    3. f3
    4. f4
    5. f5
    ''')
    val = input('请输入要执行的函数:')
    if hasattr(handler, val):
        func_or_val = getattr(handler, val)
        if isinstance(func_or_val, FunctionType):
            func_or_val()
        else:
            print(func_or_val)
    else:
        print('handler中不存在输入的属性名.')
通过反射判断并执行函数
f0 = 9
def f1():
    print('f1')
def f2():
    print('f2')
def f3():
    print('f3')
def f4():
    print('f4')
def f5():
    print('f5')
handler

 

class Account(object):
    func_list = ['login', 'logout', 'register'] #建立一个序号与方法的对应关系列表
    def login(self):
        '''
        登录
        :return:
        '''
        print('登录11')
    def logout(self):
        '''
        注销
        :return:
        '''
        print('注销11')
    def register(self):
        '''
        注册
        :return:
        '''
        print('注册11')
    def run(self):
        '''
        主代码
        :return:
        '''
        print('''
        请输入要执行的功能:
            1.登录
            2.注销
            3.注册''')
        choice = int(input('请输入要执行的序号:'))   #得到选择的方法序号
        func_name = Account.func_list[choice-1]     #通过列表索引得到方法名的字符串
        # func = getattr(Account, func_name)  #Account.login
        # func(self)        #通过类执行方法,自己传self
        func = getattr(self, func_name)             #在对象中找func_name对应的方法
        func()              #通过对象执行方法
obj1 = Account()
obj1.run()
通过创建列表对应关系,执行方法

可以被调用:

  类()

     对象()

  函数()

  方法()

def func():
    pass
class Foo(object):
    def __call__(self, *args, **kwargs):
        pass
    def func(self):
        pass
obj = Foo()
print(callable(func))
print(callable(Foo))
print(callable(obj))
print(callable(obj.func))
判断可调用

 

转载于:https://www.cnblogs.com/Virous1887/p/9560960.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值