zoukankan      html  css  js  c++  java
  • __call__、__str__、__repr__、__new__和__doc__的作用

    类中的__call__代表把一个类变成函数,加上括号就运行

    class Reader(object):
    def __init__(self, name, nationality):
    self.name = name
    self.nationality = nationality

    def __call__(self):
    print('Reader: %s Nationality: %s' % (self.name, self.nationality))


    r = Reader('Annie', 'Chinese') # 实例化类
    r() # r()运行__call__里面的代码

    类中的__str__的意思是返回一个对象的描述信息,需要返回一个字符串

    class Person():
    def __init__(self, name, age):
    self.name = name
    self.age = age

    def __str__(self):
    return '名字是:%s,年龄是:%s' % (self.name, self.age)


    person = Person('张三', 22)
    print(person) # 打印对象就可以打印出__str__方法里返回的字符串

    __str__和__repr__方法功能类似,如果没有添加__str__方法,Python 在需要该方法但找不到的时候,它会去调用__repr__方法,因此定义类的时候至少添加一个__repr__方法,这能保证自定义类中实现自我描述的功能

    class Person(object):
    """如果__str__和__repr__方法都存在,优先打印__str__的返回值"""
    def __init__(self, name, age):
    self.name = name
    self.age = age

    def __repr__(self):
    return '名字是:%s,年龄是:%s' % (self.name, self.age)

    def __str__(self):
    return '哈哈哈'


    person = Person('张三', 22)
    print(person)

    __new__方法和__init__的区别是以下几点:
    1、继承自object的新式类才有__new__
    2、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别,__init__有一个参数self,__init__在__new__的基础上可以完成一些其它初始化的动作
    3、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例,__init__不需要返回值
    4、__new__比__init__先执行,使用时尽量使用__init__函数,不要去自定义__new__函数
    5、__new__用于生成实例对象,利用这个方法和类的属性的特点可以实现设计模式的单例模式,单例模式是指创建唯一对象,单例模式设计的类只能实例

    class CapStr(str):
    def __new__(cls, old_string):
    new_string = old_string.upper()
    return str.__new__(cls, new_string)


    a = CapStr('I very like python...')
    print(a) # 打印出I VERY LIKE PYTHON...

    __doc__方法的作用打印出文档字符串,也就是注释里的内容

    def find_str():
    """查找子字符串出现的次数"""
    st = input('请输入目标字符串:').strip()
    sub_str = input('请输入子字符串:').strip()
    if sub_str in st:
    res = st.count(sub_str)
    print('子字符串在目标字符串中共出现的次数是%d' % res)


    print(find_str.__doc__) # 文档字符串,打印出注释里的内容
    find_str()
  • 相关阅读:
    讨论Android开发中的MVC设计思想
    关于AppFromwork集成XMPP开发的使用详解
    Android 强大的开发支持库组件AppFromwork框架详解
    Z语音概述from百度
    《软件形式规格说明语言-Z》 缪淮扣 学习笔记 10-12
    形式化规格技术和验证技术小结
    编译TS发生 Property or signature expected
    electron 启动错误
    java学习第三章4.运算
    java学习第三章3.基本类型的转换和直接量
  • 原文地址:https://www.cnblogs.com/laosun0204/p/7944581.html
Copyright © 2011-2022 走看看