Python的特殊属性和魔法函数

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

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

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

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

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

3.__module__和__class__

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

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

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

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

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

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

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

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

# -*- coding:utf-8 -*-


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", 19)
    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': 19, 'name': 'zhangsan'}

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

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

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

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

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

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

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

In [1]: 'ABCDE'.__len__()
Out[1]: 5

In [2]: len('ABCDE')
Out[2]: 5

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

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

13.__author__:表示作者信息。

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

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

 1 # -*- coding:utf-8 -*-
 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 
14 p = Person()
15 p.name = "zhangsan"
16 p.age = "19"
17 # p.sex = ""
18 Person.show = show # 无法限制为类添加方法
19 p.show()

 

posted @ 2019-03-29 08:55  博小园  阅读(363)  评论(0编辑  收藏  举报
回到顶部