Python 魔术方法

dir()

获取内部所有的属性方法的信息。

>>> dir(str) # 字符串类的属性和方法
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

# 上面的一些方法,有些常用的已经在字符串章节使用过
>>> 'cc'.find('c') # 位置
0
>>> ','.join('abc') # 连接
'a,b,c'

# 而以这种形式 __xx__ 存在的,我们称为 ‘魔术方法’

魔术方法

Python把类中,常用到的一些操作,抽象成为了魔术方法,当我们创建一个类时,就具备了这种功能。所以我们可以简单的认为,魔术方法就是类的一些初始方法

class X():
 pass

>>> dir(X) 
# 我们定义了一个空类,这个类默认就有这些功能
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

使用魔术方法

其实在前面的章节,我们已经在不知不觉中,大量的使用了魔术方法。

# 长度
>>> 'abc'.__len__()
3
>>> len('abc') # 当我们执行 len() 时,在Python内部就调用了 __len__() 方法
3 

>>> 'abc'.__dir__() # 等于 dir('abc')
...


自定义魔术方法

__ str__ 类信息

class X():
 pass

>>> print(X) # 默认输出
"<class '__main__.X'>"

# 自定义 __ str__
class X():
 def __str__(self):
   return 'X'
 	
>>> print(X)
'X'

__ getitem__ 切片,在序列上我们可以进行切片操作,就是内置类这个方法。

# 自定义 __ getitem__
class X():
 def __getitem__(self, n):
  return [1,2,3][n]

>>> X()[1]
2

类的性质,可以说是由这些魔术方法定义的。比如可以切片,由__ getitem__方法执行,可以循环迭代,由__ iter____ next__方法执行。根据这些大大小小方法,我们也可以组成任何自己想要的类。当我们觉得内置的字符串类用得不顺手,就可以自定义一个更好的超级字符串类来取代。

更多教程 HTML5 教程 CSS3 教程 JavaScript 教程 JQuery 教程 React.js 教程 Node.js 教程 Koa2 教程 Python 教程 Linux 教程