博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射
阅读量:6568 次
发布时间:2019-06-24

本文共 4919 字,大约阅读时间需要 16 分钟。

一、面向对象中特殊方法的补充

  1.__str__  能将对象名改成你想要的字符串,但是类型还是类

class Foo(object):    def __init__(self):        pass    def func(self):        pass    def __str__(self):        return "f1"obj = Foo()print(obj,type(obj))# f1 
  

  2.__doc__  能将类的注释文档显示出来

class Foo(object):    '''    asdqwe    '''    def __init__(self):        pass    def func(self):        passobj = Foo()print(obj.__doc__)# asdqwe

  3.__dict__  能将对象中封装的数据以字典的形式输出

class Foo(object):    def __init__(self,name,age):        self.name = name        self.age = age    def func(self):        passobj1 = Foo("a1",14)obj2 = Foo("a2",15)print(obj1.__dict__)    #{'name': 'a1', 'age': 14}print(obj2.__dict__)    #{'name': 'a2', 'age': 15}

  4.__iter__  

    如果想要把不可迭代对象转变成可迭代对象:

      1.在类中定义__iter__方法

      2.iter内部返回一个迭代器(生成器也是一种特殊迭代器)

class Foo(object):    def __init__(self,name,age):        self.name = name        self.age = age    def func(self):        pass    def __iter__(self):        return iter([11,22,33,44])obj =   Foo("a1",13)for el in obj:    print(el)# 11# 22# 33# 44

几个实例:

class StarkConfig(object):    list_display = []    def get_list_display(self):        self.list_display.insert(0,33)        return self.list_displayclass RoleConfig(StarkConfig):    list_display = [11,22]s1 = StarkConfig()result1 = s1.get_list_display()print(result1) # [33]result2 = s1.get_list_display()print(result2) # [33,33]
class StarkConfig(object):    def __init__(self):        self.list_display = []    def get_list_display(self):        self.list_display.insert(0, 33)        return self.list_displayclass RoleConfig(StarkConfig):    list_display = [11, 22]s1 = StarkConfig()result1 = s1.get_list_display()print(result1)  # [33]result2 = s1.get_list_display()print(result2)  # [33, 33]

二、sinstance/issubclass/type三种方法

  1.issubclass  #检查第一个参数是否是第二个参数的子类或子孙类

class Base(object):    passclass Foo(Base):    passclass Bar(Foo):    passprint(issubclass(Bar,Base))print(issubclass(Foo,Base))# True# True

  2.type  #获取当前对象是由哪个类创建的

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

    练习题

class Foo(object):    passclass Bar(object):    passdef 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)
View Code

  3.isinstance  判断第一个参数(对象),是否是第二个参数(类及父类)的实例

class Bar(object):    passclass Base(Bar):    passclass Foo(Base):    passobj1 = Foo()print(isinstance(obj1,Foo))print(isinstance(obj1,Base))print(isinstance(obj1,Bar))# True# True# True

    **type:判断对象是不是由某一个指定类 type(obj)==Foo

    **isinstance:判断对象是不是由某一个指定类或其父类 isinstance(obj,Foo)

三、判断是方法还是函数

  称谓:类,方法

       外,函数

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

      类.xxx   ----->xxx就是函数

      xxx  ------>xxx就是函数

    代码判断:

from types import FunctionType,MethodTypedef check(arg):    """    检查arg是函数还是方法    :param arg:    :return:    """    if isinstance(arg,FunctionType):        print("arg是一个函数")    elif isinstance(arg,MethodType):        print("arg是一个方法")    else:        print("arg什么都不是")class Foo():    def f1(self):        passobj = Foo()check(obj.f1)   #arg是一个方法check(Foo.f1)   #arg是一个函数
View Code

四、反射

  getattr  根据字符串的形式,去对象中找成员  v = getattr(obj,"func") 

  hasattr  根据字符串的形式,去判断对象中是否有成员

  setattr  根据字符串的形式,动态的设置一个成员(内存)

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

from types import FunctionTypeimport handlerwhile 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中不存在输入的属性名')
View Code
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()
View Code
callable  判断是否能被调用

转载于:https://www.cnblogs.com/qq849784670/p/9561362.html

你可能感兴趣的文章
tomcat及负载均衡
查看>>
Linux磁盘管理(实验)
查看>>
【XXX贷】2014年10月XX日发标预告
查看>>
DevExpress v15.1:WPF控件升级(四)
查看>>
掌握ConstraintLayout(十)按比例设置视图大小
查看>>
第10课--10_04_LVM之二
查看>>
搭建lnmp环境
查看>>
JavaScript改变 HTML 内容
查看>>
IPv6过渡技术
查看>>
内核调度进程的机制
查看>>
python-68:BS4获取多个标签的文本
查看>>
Web系统大规模并发——电商秒杀与抢购
查看>>
springMvc时间格式化
查看>>
JS重复引用也会导致错误
查看>>
springMVC整合shiro权限框架示例与实践
查看>>
npm安装bower时报错 我已解决
查看>>
c#中ref与out的区别
查看>>
find命令使用
查看>>
spring集成rabbitmq遇到的问题
查看>>
迅雷设置
查看>>