python中有很多以下划线开头和结尾的特殊属性和魔法函数,它们有着很重要的作用。

1.__doc__:说明性文档和信息,python自建,不需要我们定义。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4. """这里是描述性信息"""
  5. def func(self):
  6. pass
  7.  
  8. if __name__ == '__main__':
  9. print(Person.__doc__)

2.__init__():实例化方法,创建实例时自动执行。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4. def __init__(self):
  5. print("自动执行了__init__()方法")
  6.  
  7. if __name__ == '__main__':
  8. person = Person()

3.__module__和__class__

__module__:当前操作的对象属于哪一个模块,__class__:当前操作的对象属于哪一个类。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4. def __init__(self):
  5. print("自动执行了__init__()方法")
  6.  
  7. if __name__ == '__main__':
  8. person = Person()
  9. print(person.__module__)
  10. print(person.__class__)
  11.  
  12. -------输出--------
  13. __main__
  14. <class '__main__.Person'>

4.__del__():当对象在内存中被释放时,自动执行该方法,该方法无限自定义,除非我们想要在对象释放时执行一些操作。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4.  
  5. def __del__(self):
  6. print("我被回收了")
  7.  
  8. if __name__ == '__main__':
  9. person = Person()

5.__call__():如果一个类编写了该方法,则该类的实例后面加括号时会调用此方法。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4.  
  5. def __call__(self, *args, **kwargs):
  6. print("执行了__call__")
  7.  
  8. if __name__ == '__main__':
  9. person = Person()
  10. person()
  11. print(callable(Person))

可以通过callable()函数判断一个类是否为可执行的。

6.__dict__:列出类或者对象中的所有成员。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4. country = "中国"
  5. def __init__(self, name, age):
  6. self.name = name
  7. self.age = age
  8.  
  9. def func(self):
  10. print("func")
  11.  
  12. if __name__ == '__main__':
  13. print(Person.__dict__)
  14. person = Person("zhangsan", )
  15. print(person.__dict__)
  16.  
  17. -------输出结果--------
  18. {'country': '中国', '__init__': <function Person.__init__ at 0x00000247F6218B70>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, 'func': <function Person.func at 0x00000247F6218BF8>, '__doc__': None}
  19. {'age': , 'name': 'zhangsan'}

7.__str__():如果一个类定义了这个方法,则在打印对象时会自动执行该方法。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4.  
  5. def __init__(self, name, age):
  6. self.name = name
  7. self.age = age
  8.  
  9. def __str__(self):
  10. return "name:"+self.name+"----age:"+self.age
  11.  
  12. if __name__ == '__main__':
  13. person = Person("zhangsan", "")
  14. print(person)
  15.  
  16. ------输出结-------
  17. namezhangsan----age

8.__getitem__(),__setitem()__.__delitem__():取数据,设置数据,删除数据。

  1. aa = 标识符[] # 执行__getitem__()
  2. 标识符[] = bb # 执行__setitem__()
  3. del 标识符[] # 执行__delitem__()
  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4. def __setitem__(self, key, value):
  5. print("执行了__setitem__()")
  6.  
  7. def __getitem__(self, item):
  8. print("执行了__getitem__()")
  9.  
  10. def __delitem__(self, key):
  11. print("执行了__delitem__()")
  12.  
  13. if __name__ == '__main__':
  14. person = Person()
  15. r = person['a']
  16. person['a'] = "AAA"
  17. del person['a']
  18.  
  19. --------输出结果-------
  20. 执行了__getitem__()
  21. 执行了__setitem__()
  22. 执行了__delitem__()

9.__iter__():如果想让自定义的类的对象可以被迭代,则需要定义该方法,并返回一个可迭代的对象。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4.  
  5. def __iter__(self):
  6. yield
  7. yield
  8. yield
  9.  
  10. if __name__ == '__main__':
  11. person = Person()
  12. for p in person:
  13. print(p)
  14.  
  15. ------输出结果-------

10.__len__():获取对象的长度。

  1. In []: 'ABCDE'.__len__()
  2. Out[]:
  3.  
  4. In []: len('ABCDE')
  5. Out[]:

11.__repr__():返回开发可以看到的字符串,与__str__()的区别是__str__()返回用户可以看到的字符串,通常两者代码一样。

  1. # -*- coding:utf- -*-
  2.  
  3. class Person:
  4.  
  5. def __init__(self, name):
  6. self.name = name
  7.  
  8. def __str__(self):
  9. return "this is %s" % self.name
  10.  
  11. __repr__ = __str__
  12.  
  13. if __name__ == '__main__':
  14. person = Person("张三")
  15. print(person)
  16.  
  17. print(person.__repr__())
  18.  
  19. ------输出结果-------
  20. this is 张三
  21. this is 张三

12.__add__:加法,__sub__:减法,__mul__:乘法,__div__:除法,__mod__:求与运算,__pow__:幂运算

  1. class Calculator:
  2.  
  3. def __init__(self, a):
  4. self.a = a
  5.  
  6. def __add__(self, other):
  7. return self.a + other.a
  8.  
  9. if __name__ == '__main__':
  10. a = Calculator()
  11. b = Calculator()
  12. print(a + b)

13.__author__:表示作者信息。

  1. # -*- coding:utf- -*-
  2.  
  3. __author__ = "boxiaoyuan"
  4.  
  5. class Calculator:
  6.  
  7. def show(self):
  8. print(__author__)
  9.  
  10. if __name__ == '__main__':
  11. a = Calculator()
  12. a.show()

14.__slots__:可以限制实例的变量只可以添加哪些属性。

  1. # -*- coding:utf- -*-
  2.  
  3. def show(self):
  4. print("hello world")
  5.  
  6. class Person:
  7.  
  8. def __init__(self):
  9. pass
  10.  
  11. __slots__ = ("name","age")
  12.  
  13. p = Person()
  14. p.name = "zhangsan"
  15. p.age = ""
  16. # p.sex = "男"
  17. Person.show = show # 无法限制为类添加方法
  18. p.show()

Python的特殊属性和魔法函数的更多相关文章

  1. PythonI/O进阶学习笔记_2.魔法函数

    前言: 本文一切观点和测试代码是在python3的基础上. Content: 1.什么是魔法函数,魔法函数__getitem__在python中应用. 2.python的数据模型和数据模型这种设计对p ...

  2. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  3. Python的魔法函数系列 __getattrbute__和__getattr__

      #!/usr/bin/env python # -*- coding: utf-8 -*- import sys __metaclass__ = type """ _ ...

  4. Python魔法函数

    python中定义的以__开头和结尾的的函数.可以随意定制类的特性.魔法函数定义好之后一般不需要我们自己去调用,而是解释器会自动帮我们调用. __getitem__(self, item) 将类编程一 ...

  5. python魔法函数之__getattr__与__getattribute__

    getattr 在访问对象的属性不存在时,调用__getattr__,如果没有定义该魔法函数会报错 class Test: def __init__(self, name, age): self.na ...

  6. python进阶之魔法函数

    __repr__ Python中这个__repr__函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串.如果我们直接打印一个类,向下面这样 class A():     ...

  7. gj3 Python数据模型(魔法函数)

    3.1 什么是魔法函数 类里面,实现某些特性的内置函数,类似 def __xx__(): 的形式. 不要自己定义XX,并不是和某个类挂钩的 class Company(object): def __i ...

  8. python内置函数和魔法函数

    内置方法:Python中声明每一个类系统都会加上一些默认内置方法,提供给系统调用该类的对象时使用.比如需要实例化一个对象时,需要调用该类的init方法:使用print去打印一个类时,其实调用的是str ...

  9. python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用 __dict__ __dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值. 既然__dict__是个字典那么我们就 ...

随机推荐

  1. MariaDB 脚本

    研究MariaDB, 需要mock up一些假数据: 生成n个长度整型数的函数rand_num: CREATE DEFINER=`root`@`localhost` FUNCTION `rand_nu ...

  2. ceph 创建和删除osd

    ceph 创建和删除osd 1.概述         本次主要是使用ceph-deploy工具和使用ceph的相关命令实现在主机上指定磁盘创建和删除osd,本次以主机172.16.1.96(主机名ha ...

  3. Django项目部署-01

    1. 安装Python 下载链接:https://www.python.org/getit/ 我这边下载的是3.6.5的版本的执行版本,安装过程中选择自动安装pip 2.安装django pip in ...

  4. 使用JAVA爬取博客里面的所有文章

    主要思路: 1.找到列表页. 2.找到文章页. 3.用一个队列来保存将要爬取的网页,爬取队头的url,如果队列非空,则一直爬取. 4.如果是列表页,则抽取里面所有的文章url进队:如果是文章页,则直接 ...

  5. Swift 添加自定义响应事件

    一,新建一个协议(Protocol) VisitURLProtocol.swift import UIKit protocol VisitURLProtocol{ func didVisitURL(u ...

  6. eclipse+minGW 调试ffmpeg错误:No symbol table is loaded. Use the "file" command.

    转载地址:http://www.blogjava.net/fancydeepin/archive/2012/11/19/391520.html 数据结构第二篇:  eclipse SDK 安装和配置 ...

  7. spring cloud微服务搭建(一)

    martin fowler大神提出微服务的概念后,各种微服务的技术满天飞,现在用的比较多的是spring cloud和阿里的dubbo,由于dubbo 在16年10月份就停止更新了,不过好像前些天又更 ...

  8. telnet测试端口是否正常打开

    点击计算机的开始菜单-->运行 ,输入CMD命令,然后确定.打开cmd命令行.   输入telnet测试端口命令: telnet IP 端口 或者 telnet 域名 端口 回车   如果端口关 ...

  9. Windows下Git中正确显示中文的设置方法

    Windows下Git中正确显示中文的设置方法 具体设置方法如下: 进入目录etc:$ cd /etc 1. 编辑 gitconfig 文件:$ vi gitconfig.在其中增加如下内容: [gu ...

  10. java定时任务调度工具Timer与Quartz的区别

    Timer与Quartz的区别有三点: 1.出身不同:Timer由jdk直接提供,调用方式简单粗暴,不需要其它jar包支持.Quartz并非jdk自带,需要引入相应的jar包 2.能力区别:主要体现在 ...