Python Magic Methods

网上有许多关于Magic Methods的博客,比如说https://segmentfault.com/a/1190000007256392。使用magic methods使得在编写Python程序时可以重载对象的运算符行为,或是提供str(),for … in (__iter__)的接口,用途很多,无法一一枚举。

下面给出了常用的Magic Methods名称,应该不需要什么解释。

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

'''
Copyright 2017 YanWen <i@yanwen.email>
'''

'''
# Most Used:
__init__
__del__

# Magic Operators:
__(r)add__
__(r)sub__
__(r)truediv__
__(r)floordiv__            -> //
__(r)mod__
__(r)pow__
__(r)and__
__(r)xor__
__(r)or__

__lt__
__le__
__eq__
__ne__
__gt__
__ge__

# Others:
__len__
__getitem__
__setitem__
__delitem__
__iter__
__contains__
__call__
__str__
__int__

__...__

'''

我们可以在Data model — special-method-names — Python 3.6.2 documentation。找到3.6版本Magic Methods的完整文档。

下面有一个简单的例子,通过__repr__来了解Magic的优雅。__repr__用于当对象作为print的参数传入时,重载print的行为。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
Copyright 2017 YanWen <i@yanwen.email>
'''

class Stack(list):
    """docstring for Stack."""

    def __init__(self, arg):
        '''constructor

        Args:
          arg: tuple
        Returens:
          none
        Raises:
          none
        '''
        super(Stack, self).__init__(arg)


    def __repr__(self):
        '''called when printing the obj

        Args:
          none
        Returens:
          (string) stack
        Raises:
          none
        '''
        return "Stack({})".format(super(Stack, self).__repr__())

    def pop(self):
        '''pop

        Args:
          none
        Returens:
          super
        Raises:
          super
        '''
        return super(Stack, self).pop(-1)

    def push(self, item):
        '''push

        Args:
          anything
        Returens:
          none
        Raises:
          super
        '''
        super(Stack, self).append(item)


    @classmethod
    def new(cls, * args):
        '''new obj

        Args:
          args: tuple
        Returens:
          none
        Raises:
          none
        '''
        return Stack(args)


if __name__ == '__main__':
    stack = Stack.new(2, 4, 6, 8)
    print(stack)
    stack.pop()
    print(stack)
    stack.push(0)
    print(stack)

在这个简单的堆栈模拟中,我们得到的输出为:

Stack([2, 4, 6, 8])
Stack([2, 4, 6])
Stack([2, 4, 6, 0])

通过list模拟堆栈,当需要打印堆栈时,在输出内容里添加“Stack(堆栈)”。

此例没有难度,容易理解。当然,还有根多奇特的特性等你去发掘。

作者: V

Web Dev

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s