zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Codeforces 1291 Round #616 (Div. 2) B
    总结
    刷新DNS解析缓存+追踪+域名解析命令
    数学--数论--Hdu 5793 A Boring Question (打表+逆元)
    Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析
    LeetCode 117 Populating Next Right Pointers in Each Node II
    LeetCode 116 Populating Next Right Pointers in Each Node
    test test
    LeetCode 115 Distinct Subsequences
    LeetCode 114. Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/strive-man/p/8550908.html
Copyright © 2011-2022 走看看