Python类(七)-类的特殊成员方法
-
__doc__
用来表示类的描述信息
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self,name,age):
self.name = name
self.age =age
if __name__ == '__main__':
p = Person('John',22)
print(p.__doc__)
运行结果

-
__class__
用来表示当前对象的类
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self,name,age):
self.name = name
self.age =age
if __name__ == '__main__':
p = Person('John',22)
print(p.__class__)
运行结果

当前程序的Person类
-
__module__
用来表示当前操作对象所在的模块
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self,name,age):
self.name = name
self.age =age
if __name__ == '__main__':
p = Person('John',22)
print(p.__module__)
运行结果

-
__call__
实例化的对象后加上括号,来执行该方法
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self,name,age):
self.name = name
self.age =age
def __call__(self, *args, **kwargs):
print("Test For Class")
if __name__ == '__main__':
p = Person('John',22)
p()
运行结果

如果没有定义该方法,直接调用实例化的对象就会报错

-
__str__
打印对象时,将会打印该方法的返回值
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self,name,age):
self.name = name
self.age =age
if __name__ == '__main__':
p = Person('John',22)
print(p)
运行

如果没有定义__str__方法,直接打印对象的话,就会返回该对象的内存地址
如果有定义__str__方法的话
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self,name,age):
self.name = name
self.age =age
def __str__(self):
return "The Person Class"
if __name__ == '__main__':
p = Person('John',22)
print(p)
运行

打印的不是对象的内存地址,而是__str__方法的返回值
-
__dict__
用来查看类或对象中所有的成员,以字典的格式来表示
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self,name,age):
self.name = name
self.age =age
def __str__(self):
return "The Person Class"
if __name__ == '__main__':
p = Person('John',22)
print(Person.__dict__)
print(p.__dict__)
运行结果

-
__setitem__,__getitem__,__delitem__
把一个实例“变成”字典
__setitem__为设置,__getitem__为获取,__delitem__为删除
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
'''这个类是用来描述人的'''
def __init__(self):
self.info = {}
def __getitem__(self, key):
print("getitem:", key)
return self.info.get(key)
def __setitem__(self, key, value):
print("setitem:", key, value)
self.info[key] = value
def __delitem__(self, key):
print("delitem:", key)
if __name__ == '__main__':
p = Person()
p['name'] = 'John' #触发执行__setitem__
p['age'] = 22
print(p['name']) #触发执行__getitem__
del p['age'] #触发执行__delitem__,可在__delitem__方法中设置删除
运行

如果设置值的话,就会执行__setitem__方法
如果获取值的话,就会执行__getitem__方法
如果删除值的话,就会执行__delitem__方法
-
__new__
类通过__new__方法来进行实例化,__new__方法在内部调用了__init__方法
通常是不需要写__new__方法的,如果写了,就是重构__new__方法,需要继承父类的__new__方法才能实例化对象
# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"
class Person(object):
def __init__(self, name):
self.name = name
print("init")
def __new__(cls, *args, **kwargs):
print("new")
print(cls) #打印的为Person类的内存对象
return object.__new__(cls) #继承父类的__new__方法
if __name__ == '__main__':
p = Person('John')
执行结果

可以看到,是先执行__new__方法,再执行__init__方法的

浙公网安备 33010602011771号