• 面向对象【进击篇】


    其他相关

    一、isinstance(obj, cls)

     检查是否obj是否是类 cls 的对象,检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

    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))  # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

    二、issubclass(sub, super)

    检查sub类是否是 super 类的派生类

    class Base(object):
        pass
    
    class Foo(Base):
        pass
    
    class Bar(Foo):
        pass
    
    print(issubclass(Bar, Base))  # 检查第一个参数是否是第二个参数的子子孙孙类

    三、type:获取当前对象是由哪个类创建

    class Foo(object):
        pass
    
    obj = Foo()
    print(obj, type(obj))  # 获取当前对象是由那个类创建。
    if type(obj) == Foo:
        print('obj是Foo类型')

    四、方法和函数

       称谓:
    类,方法
    外,函数
    到底方法函数?
    对象.xxx --> xxx就是方法
    类.xxx --> xxx就是函数
    xxx --> xxx就是函数
    打印查看:
    function
    method
    from types import MethodType,FunctionType
    def check(arg):
     """
     检查arg是方法还是函数?
     :param arg:
     :return:
     """
     if isinstance(arg,MethodType):
        print('arg是一个方法')
     elif isinstance(arg,FunctionType):
        print('arg是一个函数')
     else:
        print('不知道是什么')
    代码检查

    五、反射

    a. 需求

    总结:
    v = getattr(obj,"func") # 根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员。

    练习题:
    ..

    好记:
    getattr # 根据字符串的形式,去对象中找成员。
    hasattr # 根据字符串的形式,去判断对象中是否有成员。
    setattr # 根据字符串的形式,动态的设置一个成员(内存)
    delattr # 根据字符串的形式,动态的删除一个成员(内存)
    应用一:
    # by luffycity.com
    from types import FunctionType
    import handler

    while True:
    print("""
    系统支持的函数有:
    1. f1
    2. f2
    3. f3
    4. f4
    5. f5
    """)
    val = input("请输入要执行的函数:") # val = "f1"

    # 错误
    # handler.val()
    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中不存在输入的属性名')

    # 正确方式
    """
    if val == 'f1':
    handler.f1()
    elif val == 'f2':
    handler.f2()
    elif val == 'f3':
    handler.f3()
    elif val == 'f4':
    handler.f4()
    elif val == 'f5':
    handler.f5()
    """

    应用二:

    class Account(object):
    func_list = ['login', 'logout', 'register']

    def login(self):
    """
    登录
    :return:
    """
    print('登录111')

    def logout(self):
    """
    注销
    :return:
    """
    print('注销111')

    def register(self):
    """
    注册
    :return:
    """
    print('注册111')

    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)

    func = getattr(self, func_name) # self.login
    func()

    obj1 = Account()
    obj1.run()

    obj2 = Account()
    obj2.run()
  • 相关阅读:
    Entity Framework 6 (7) vs NHibernate 4: DDD perspective(纯净DDD很难很难...)
    asp.net解决高并发的方案
    我所经历的SAP选型[转]
    为什么我不再用 .NET 框架
    Why I Left the .NET Framework
    Docker 传奇之 dotCloud
    ICE概述
    .NET Out Of Memory Exception
    iOS-申请邓白氏编码的超详细流程介绍
    .NET对象与Windows句柄(三):句柄泄露实例分析
  • 原文地址:https://www.cnblogs.com/shanae/p/9560283.html
Copyright © 2020-2023  润新知