__call__、__str__、__repr__、__new__、__doc__和__name__==__main__的作用

类中的__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()
posted @ 2017-12-01 21:51  laosun0204  阅读(143)  评论(0编辑  收藏  举报