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()