zoukankan      html  css  js  c++  java
  • python中的魔术属性与魔法方法

    1.魔法属性

    ·  1.1__doc__魔法属性  表示类的描述信息

    class Fo:
        """ 这是今天第一个魔术属性__doc__"""
        def func(self):
            pass
    
    print(Fo.__doc__)
    

      运行结果

    这是今天第一个魔术属性__doc__
    

      1.2.__moudle__魔法属性  表示当前操作的对象在那个模块

    dome1.py
    
    
    # -*- coding:utf-8 -*-
    
    class Person(object):
        def __init__(self):
            self.name =' __moudle__'
    

      

    dom2.py
    
    from dome1 import Person
    
    obj = Person()
    print(obj.__module__)  
    

      运行结果

    dome1
    

      1.3 __class__魔法属性   表示当前操作的对象的类是什么

    dome1.py
    
    
    # -*- coding:utf-8 -*-
    
    class Person(object):
        def __init__(self):
            self.name =' __moudle__'
    

      

    dom2.py
    
    from dome1 import Person
    
    obj = Person()
    print(obj.__class__)  
    

      运行结果

    Person
    

    2.魔法方法

      2.1 __init__ () 魔法方法   初始化类属性方法,通过类创建对象时,自动触发执行

    class Person:
        def __init__(self, name):
            self.name = name
            self.age = 18
    
    
    obj = Person('python')
    obj.name

      运行结果

    python
    

      2.2 __del__() 魔法方法  当对象在内存中被释放时,自动触发执行

    class Dome:
        def __del__(self):
            print('类已经被删除')
    obj  = Dome()
    

      运行结果

    类已经被删除
    

      2.3 __str__ () 魔法方法   打印 对象 时,默认输出该方法的返回值

    class Dome:
        def __str__(self):
            return 'python'
    obj = Dome()
    print(obj)
    

      运行结果

    python
    

      2.4 __dict__() 魔法方法  类或对象中的所有属性

    class Province(object):
        country = 'China'
    
        def __init__(self, name, count):
            self.name = name
            self.count = count
    
        def func(self, *args, **kwargs):
            print('func')
    
    # 获取类的属性,即:类属性、方法、
    print(Province.__dict__)
    
    obj1 = Province('山东', 10000)
    print(obj1.__dict__)
    
    
    obj2 = Province('山西', 20000)
    print(obj2.__dict__)
    

      运行结果

    {'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}
    
    {'count': 10000, 'name': '山东'}
    
    {'count': 20000, 'name': '山西'}
    

      2.6 __getitem__(),__setitem__(),__delitem__()魔法方法 用于索引操作,如字典。以上分别表示获取、设置、删除数据

    # -*- coding:utf-8 -*-
    
    class Dome(object):
    
        def __getitem__(self, key):
            print('__getitem__', key)
    
        def __setitem__(self, key, value):
            print('__setitem__', key, value)
    
        def __delitem__(self, key):
            print('__delitem__', key)
    
    
    obj = Dome()
    
    result = obj['R1']      # 自动触发执行 __getitem__
    obj['R2'] = 'laotie'    # 自动触发执行 __setitem__
    del obj['R1']           # 自动触发执行 __delitem__
    

      运行结果

    __getitem__ R1
    __setitem__ R2 python
    __delitem__ R1
    

      由于这三个方法单独使用没作用,所以通常配合使用来实现某种功能

      2.7 __iter__()魔法方法 让一个对象变得可以迭代

      由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

      2.8 __next__()魔法方法 定义一个迭代器,让其能够通过next(迭代对象的迭代器)对一个可迭代对象进行迭代

      由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

      2.9 __name__()魔法方法 

      这个魔法方法,并不作用于类(这里我把它归为魔法方法可能不够严谨),当前程序的名称

    # -*- coding:utf-8 -*-
    
    class Foo(object):
    
        def __getitem__(self, key):
            print('__getitem__', key)
    
        def __setitem__(self, key, value):
            print('__setitem__', key, value)
    
        def __delitem__(self, key):
            print('__delitem__', key)
    if __name__ == '__main__':
        
        obj = Foo()
    
        result = obj['R1']      # 自动触发执行 __getitem__
        obj['R2'] = 'python'    # 自动触发执行 __setitem__
        del obj['R1']           # 自动触发执行 __delitem__
    

      运行结果

    __getitem__ R1
    __setitem__ R2 python
    __delitem__ R1
    

      注意,该方法所在的.py文件如果作为一个工具包引入时,它里面包括的代码不会被引入,通常作为开发人员的调试空间(为所欲为也不会被外界发现)

      2.10 __enter__(),__exit__() 魔法方法,上下文管理器时使用

      __enter__() 进入‘上文操作’,__exit__()进入下文操作

      

    class File():
    
        def __init__(self, filename, mode):
            self.filename = filename
            self.mode = mode
    
        def __enter__(self):
            print("进入了上文操作!")
            self.f = open(self.filename, self.mode)
            return self.f
    
        def __exit__(self, *args):
            print("进入了下文操作!")
            self.f.close()
    

      当调用该类打开一个文件时,会自动调用__enter__()方法打开文件,但文件调用完成后会自动给调用__exit__()方法关闭文件,以免造成内存的浪费,顺便说下:with open() 方法的原理和这个自定义上下文管理器是一样的

    由于前面的博客有些魔法方法已经做了解析,所以这次就没有进行详细的说明,所以可能有些魔法属性和魔法方法没有总结上去,欢迎大家补充

      

  • 相关阅读:
    jmeter怎么衡量tps的值
    QPS、TPS、并发用户数、吞吐量关系
    PPAPI插件开发指南
    WebRTC手记之WebRtcVideoEngine2模块
    WebRTC手记Channel概念
    WebRTC手记之本地音频采集
    WebRTC手记之本地视频采集
    WebRTC手记之框架与接口
    WebRTC手记之初探
    Chromium的GPU进程启动流程
  • 原文地址:https://www.cnblogs.com/xuchuankun/p/9531862.html
Copyright © 2011-2022 走看看