zoukankan      html  css  js  c++  java
  • 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__方法的

  • 相关阅读:
    C库函数标准编程之fscanf()函数解读及其实验
    WPF-20:richtextbox相关操作(转)
    C++内存管理学习笔记(7)
    Android 网络编程 Socket Http
    C++ Preprosessor import
    JAVA Socket(多个客户同时连接,信息共享) client (java/ruby)
    WPF页面跳转
    jenkis编译报错:需要class,interface或enum
    The 7 Stages Of Scaling Web Apps--reference
    大型网站架构演变和知识体系--转
  • 原文地址:https://www.cnblogs.com/sch01ar/p/8371696.html
Copyright © 2011-2022 走看看