zoukankan      html  css  js  c++  java
  • day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()

    __str__()
    __repr__()
    __len__()

    str() 转字符串
    repr()   让字符原形毕露的方法
    len() 计算长度

    内置的方法很多,但是并不是全部都在object中,比如len(),__len__(),比如说数字,时间,还有对象都是无法计算长度
     1 # __del__         析构函数
     2 # 删除,python解释器本身也会自动删除
     3 class A:
     4     def __del__(self):
     5         print("执行我啦")
     6 a = A()
     7 # del a        # 这里不些括号也行
     8 del(a)        # 即删除了变量,又执行了这个方法,先执行后删除
     9             # 执行我啦
    10 print(a)    # NameError: name 'a' is not defined
    __call__()  调用的本质
    __str__()   把一个类的示例变成字符串输出(其实是为了输出给客户看的.更加的容易清晰的理解这个实例是个啥)
     1 class ABC():
     2     def __init__(self,name):
     3         self.name = name
     4     
     5     def aaa(self):
     6         print(f"{self.name} is aaa")
     7         return "aaa"
     8     
     9     def __call__(self, *args, **kwargs):
    10         print("it's working~~")
    11         
    12     def __str__(self):
    13         print("这是一个ABC的实例")        # __str__返回值必须要有. 不然会报错.
    14         # TypeError: __str__ returned non-string (type NoneType)
    15         return "这是一个ABC的实例"  
    16 
    17 a = ABC("yangtuo")        # 实例化
    18 
    19 # 直接对实例操作实际是操作的就是__call__()方法
    20 a()                       # it's working~~
    21 
    22 # 在没有__call__方法的时候直接打印这个实例会返回一段内存地址
    23 # print(a)                # <__main__.ABC object at 0x000000000258D240>
    24 # 存在__call__方法的时候返回不会这么死板
    25 print(a)                  # 这是一个ABC的实例
    26 
    27 a.aaa()                   # yangtuo is aaa
    28 print(a.name)             # yangtuo

    内置函数类方法和内置的函数方法其实有很深的联系

    简单来说就是: 开发者看 repr 客户看 str
    为了保证一致性可以用只重写__str__()并设置__repr__ = __str__,就可以保证上面使用方法的结果都是调用重写的__str__()。

     1 >>> class Test():
     2     def __init__(self):
     3         self.prompt = "hello,zss041962"
     4 
     5 >>> t = Test()
     6 >>> t
     7 <__main__.Test object at 0x0000000002F3EF28>
     8 >>> print(t)
     9 <__main__.Test object at 0x0000000002F3EF28>
    10 
    11 # 看到了么?上面打印类对象并不是很友好,显示的是对象的内存地址
    12 # 下面我们重构下该类的__repr__以及__str__,看看它们俩有啥区别
    13 
    14 >>> #重构__repr__
    15 >>> class TestRepr(Test):
    16     def __repr__(self):
    17         return "Show:%s"%self.prompt
    18 # 重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了
    19 >>> t1 = TestRepr()
    20 >>> t1
    21 Show:hello,zss041962
    22 >>> print(t1)
    23 Show:hello,zss041962
    24 
    25 
    26 >>> #重构__str__
    27 >>> class TestStr(Test):
    28     def __str__(self):
    29         return "Show:  %s"%self.prompt
    30 # 你会发现,直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了
    31 >>> t2 = TestStr()
    32 >>> t2
    33 <__main__.TestStr object at 0x00000000031C33C8>
    34 >>> print(t2)
    35 Show:  hello,zss041962
    isinstance 检查一个对象是不是一个类的对象
    issubclass 检查一个一个类是不是另一个类的子类
     1 # isinstance 检查一个对象是不是一个类的对象
     2 # isinstance(obj,cls)
     3 class A():pass
     4 a = A()
     5 print(isinstance(a,A))    # True
     6 
     7 
     8 # issubclass 检查一个一个类是不是另一个类的子类
     9 # issubclass(sub,super)
    10 class A():pass
    11 class B(A):pass
    12 print(issubclass(B,A))    # True
    13 # 这个顺序有点难记忆, B是不是A 的子类?是就返回 T 不是返回 F 
    14 # 被检查是否是子类的放在前面
    15 # 被检查是否是父类的放在后面


  • 相关阅读:
    获取当前用户的网络状态--iOS
    网络请求 ---iOS
    一个小项目中需要注意的几个地方
    在项目中几个需要学习的知识
    简单三级联动的建立
    验证码在页面中的使用
    嘿嘿。今天学习了AJAX的几个方法
    状态保持以及AJAX的初步学习
    webform的学习(2)
    WebForm的初步认识
  • 原文地址:https://www.cnblogs.com/shijieli/p/9935395.html
Copyright © 2011-2022 走看看