• isinstance,issubclass,内置函数__str__和__repr__,__format__,dir()函数


    isinstance(obj,cls)  检查是否obj是否是类 cls 的对象  #对象与类之间的关系

    判断第一个参数是否是第二个参数的实例

    # 身份运算
    # 2 == 3   # 值是否相等
    # 2 is 3 # 内存地址是否相等
    class A:pass
    class B(A):pass
    class C(B):pass
    c = C()
    print(isinstance(c,A)) #True # 包含继承关系的判断
    print(type(B) is B) #False
    print(type(B) is A) #False # type只关心创建这个对象的类
     

    issubclass(sub, super)  检查sub类是否是 super 类的派生类   #类与类之间的关系

    class A:pass
    class B(A):pass
    print(issubclass(A,B))      #False
    print(issubclass(B,A))      #Ture
    # 第一个参数是疑似子类,第二个参数是疑似父类.
    # 最终结果如果真的是父子类关系,则返回True

    改变对象的字符串显示  __str__ ,__repr__

    自定制格式化字符串  __format__

     1 #_*_coding:utf-8_*_
     2 
     3 format_dict={
     4     'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
     5     'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
     6     'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
     7 }
     8 class School:
     9     def __init__(self,name,addr,type):
    10         self.name=name
    11         self.addr=addr
    12         self.type=type
    13 
    14     def __repr__(self):
    15         return 'School(%s,%s)' %(self.name,self.addr)
    16     def __str__(self):
    17         return '(%s,%s)' %(self.name,self.addr)
    18 
    19     def __format__(self, format_spec):
    20         # if format_spec
    21         if not format_spec or format_spec not in format_dict:
    22             format_spec='nat'
    23         fmt=format_dict[format_spec]
    24         return fmt.format(obj=self)
    25 
    26 s1=School('oldboy1','北京','私立')
    27 print('from repr: ',repr(s1))
    28 print('from str: ',str(s1))
    29 print(s1)
    30 
    31 '''
    32 str函数或者print函数--->obj.__str__()
    33 repr或者交互式解释器--->obj.__repr__()
    34 如果__str__没有被定义,那么就会使用__repr__来代替输出
    35 注意:这俩方法的返回值必须是字符串,否则抛出异常
    36 '''
    37 print(format(s1,'nat'))
    38 print(format(s1,'tna'))
    39 print(format(s1,'tan'))
    40 print(format(s1,'asfdasdffd'))
     1 class B:
     2 
     3      def __str__(self):
     4          return 'str : class B'
     5 
     6      def __repr__(self):
     7          return 'repr : class B'
     8 
     9 
    10 b=B()
    11 print('%s'%b)
    12 print('%r'%b)
    13 
    14 %s和%r

    __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员

    • 打印操作会首先尝试__str__和str内置函数(print运行的内部等价形式),它通常应该返回一个友好的显示。

    • __repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,如果没有使用__str__,会使用print和str。它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示。

    当我们想所有环境下都统一显示的话,可以重构__repr__方法;当我们想在不同环境下支持不同的显示,例如终端用户显示使用__str__,而程序员在开发期间则使用底层的__repr__来显示,实际上__str__只是覆盖了__repr__以得到更友好的用户显示。

    dir()函数

    定义一个模块

    #my_module.py
    print('from the my_module.py')
    
    money=1000
    
    def read1():
        print('my_module->read1->money',money)
    
    def read2():
        print('my_module->read2 calling read1')
        read1()
    
    def change():
        global money
        money=0
    my_module

    内建函数dir是用来查找模块中定义的名字,返回一个有序字符串列表

    import my_module
    dir(my_module)

    如果没有参数,dir()列举出当前定义的名字


    dir()不会列举出内建函数或者变量的名字,它们都被定义到了标准模块builtin中,可以列举出它们,

    import builtins
    dir(builtins)
  • 相关阅读:
    JavaScript之事件委托
    js中的事件委托(事件代理)详解
    CentOS已经安装命令,但提示找不到
    在Linux下创建7种类型的文件
    python源码安装的包的卸载
    新建文件所属组设置
    FFmpeg基础
    微服务架构概念
    一台 Java 服务器可以跑多少个线程?
    「学习的真正作用」​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​写出我心(一百三十八)
  • 原文地址:https://www.cnblogs.com/strive-man/p/8550908.html
Copyright © 2020-2023  润新知