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__方法的

原文地址:https://www.cnblogs.com/sch01ar/p/8371696.html