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

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

 # -*- coding:utf- -*-

 class Person:
"""这里是描述性信息"""
def func(self):
pass if __name__ == '__main__':
print(Person.__doc__)

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

 # -*- coding:utf- -*-

 class Person:
def __init__(self):
print("自动执行了__init__()方法") if __name__ == '__main__':
person = Person()

3.__module__和__class__

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

 # -*- coding:utf- -*-

 class Person:
def __init__(self):
print("自动执行了__init__()方法") if __name__ == '__main__':
person = Person()
print(person.__module__)
print(person.__class__) -------输出--------
__main__
<class '__main__.Person'>

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

 # -*- coding:utf- -*-

 class Person:

     def __del__(self):
print("我被回收了") if __name__ == '__main__':
person = Person()

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

 # -*- coding:utf- -*-

 class Person:

     def __call__(self, *args, **kwargs):
print("执行了__call__") if __name__ == '__main__':
person = Person()
person()
print(callable(Person))

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

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

# -*- coding:utf- -*-

class Person:
country = "中国"
def __init__(self, name, age):
self.name = name
self.age = age def func(self):
print("func") if __name__ == '__main__':
print(Person.__dict__)
person = Person("zhangsan", )
print(person.__dict__) -------输出结果--------
{'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}
{'age': , 'name': 'zhangsan'}

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

 # -*- coding:utf- -*-

 class Person:

     def __init__(self, name, age):
self.name = name
self.age = age def __str__(self):
return "name:"+self.name+"----age:"+self.age if __name__ == '__main__':
person = Person("zhangsan", "")
print(person) ------输出结-------
name:zhangsan----age:

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

 aa = 标识符[]    # 执行__getitem__()
标识符[] = bb # 执行__setitem__()
del 标识符[] # 执行__delitem__()
 # -*- coding:utf- -*-

 class Person:
def __setitem__(self, key, value):
print("执行了__setitem__()") def __getitem__(self, item):
print("执行了__getitem__()") def __delitem__(self, key):
print("执行了__delitem__()") if __name__ == '__main__':
person = Person()
r = person['a']
person['a'] = "AAA"
del person['a'] --------输出结果-------
执行了__getitem__()
执行了__setitem__()
执行了__delitem__()

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

 # -*- coding:utf- -*-

 class Person:

     def __iter__(self):
yield
yield
yield if __name__ == '__main__':
person = Person()
for p in person:
print(p) ------输出结果-------

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

In []: 'ABCDE'.__len__()
Out[]: In []: len('ABCDE')
Out[]:

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

 # -*- coding:utf- -*-

 class Person:

     def __init__(self, name):
self.name = name def __str__(self):
return "this is %s" % self.name __repr__ = __str__ if __name__ == '__main__':
person = Person("张三")
print(person) print(person.__repr__()) ------输出结果-------
this is 张三
this is 张三

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

 class Calculator:

     def __init__(self, a):
self.a = a def __add__(self, other):
return self.a + other.a if __name__ == '__main__':
a = Calculator()
b = Calculator()
print(a + b)

13.__author__:表示作者信息。

 # -*- coding:utf- -*-

 __author__ = "boxiaoyuan"

 class Calculator:

     def show(self):
print(__author__) if __name__ == '__main__':
a = Calculator()
a.show()

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

 # -*- coding:utf- -*-

 def show(self):
print("hello world") class Person: def __init__(self):
pass __slots__ = ("name","age") p = Person()
p.name = "zhangsan"
p.age = ""
# p.sex = "男"
Person.show = show # 无法限制为类添加方法
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. Linux操作系统下的多线程编程详细解析----条件变量

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法,弥补了互斥锁(Mutex)的不足. 1.初始化条件变量pthread_cond_init #include <pthread.h> ...

  2. js操作serviceWorker缓存静态文件

    js操作serviceWorker缓存静态文件 serviceWorker的作用就是用来做离线应用的,在手机端程序中用的较多 先看下效果 index.html <!DOCTYPE html> ...

  3. python---Redis 学习笔记

    缓存 前言: 大家都听过缓存,缓存是干啥的呢?我们可以和json和pickle来说,两个程序之间实现信息交互,可以通过在A程序中把数据改成json ,然后传给B程序,通过文件这个介质.文件这个效率很低 ...

  4. Rhel6.0部署Oracle10g报错相关问题记录

    1.libawt.so及libXt.so.6,lib*系列报错,到最后的界面ruiy哥我笑了!.相信你也会笑的!终于找到根源了!哇哈哈!希望后面不要报error in invoking target ...

  5. DIV+CSS+JS实现图片<ul><li></li></ul>无缝滚动代码

    (含上下左右滚动代码) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  6. mixer音量的设置:amixer小工具的…

    1.关于alsa-utils和lib的移植我的上一篇博文中已经说明了,下面我就来说说我的混音器mixer音量控制的调节过程,网上的很多方法都是比较基本的入门没有知名具体的操作方法,在此我来谈谈我的设置 ...

  7. Perl 变量:标量变量、数组变量、哈希变量和变量上下文

    一.Perl 变量变量是存储在内存中的数据,创建一个变量即会在内存上开辟一个空间.解释器会根据变量的类型来决定其在内存中的存储空间,因此你可以为变量分配不同的数据类型,如整型.浮点型.字符串等.上一章 ...

  8. Reporting Service中配置oracle 数据连接

    一.安装配置报表服务器 数据源 1.安装oracle客户端32位“Oracle - OraClient11g_home1_32bit” 2.配置监听及tnsnames.ora 3.配置ODBC 添加一 ...

  9. 八数码问题——A*大法好

    [描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示. 空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局( ...

  10. JUnit 两日游

    从一个简单的Junit demo到一个用户名与密码的验证 学习Junit,首先肯定是要环境的搭建与配置. 第一步,安装JDK,配置环境变量 第二步,安装eclipse.OS X环境下,eclipse并 ...