zoukankan      html  css  js  c++  java
  • Python(2.7.6) 特殊方法

      

    在 Python 中有种特殊方法,也称为魔法方法。特殊方法的方法名的前后各有两个下划线,如__init__,这种拼写表示名字有特殊的意义。如果类实现了这些方法中的某一个,那么这个方法会在特殊的情况下被调用。

    可以使用 dir()  查看对象实现的特殊方法。

    >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

    当类实现了 __init()__ 方法,在创建对象的时候会自动调用 __init()__ 方法。

    当使用运算符进行运算的时候,实际上是通过调用对象的特殊方法实现的,如:
      [1, 2] + [3, 4, 5]
    实际执行的操作是:
      [1, 2].__add__([3, 4, 5])
    所以,如果想实现类似于 C++ 中的运算符重载,让自定义的类对象通过运算符进行运算,只要在自定义的类中实现相应的特殊方法即可:

    class MyObject(object):
        
        def __init__(self, size = 0):
            super(MyObject, self).__init__()
            self.size = size
    
        def __add__(self, obj):
            if isinstance(obj, MyObject) :
                return MyObject(self.size + obj.size)
            else :
                raise TypeError('can only concatenate MyObject (not "%s") to MyObject' % type(obj))
    
    obj = MyObject(2) + MyObject(3)
    print obj.size

    许多内置函数也是调用对象的特殊方法,如:
      len('hello world')
    实际执行的操作是
      'hello world'.__len__()

    在 Python 中,一切皆对象,函数也是一个对象。实际上,实现了 __call__() 方法的对象都可以当作一个函数。

    class Square(object):    
        def __call__(self, n):
            return n ** 2
    
    square = Square()
    print square(10)
  • 相关阅读:
    docker 介绍,安装,镜像操作, docker换源
    go语言5 接口, 并发与并行, go协程, 信道, 缓冲信道, 异常处理, python进程线程
    [编织消息框架]目录
    2017总结
    赚钱方法[信息红利]
    面单 全单 单板 批发吉他民谣 知乎 百度知道 百度贴吧 吉他批发
    看第三部杀破狼感想
    海豚极货店 淘宝店开张啦
    我上头条了
    尤克里里 ukulele 单板 非kaka tom uma
  • 原文地址:https://www.cnblogs.com/huey/p/4365424.html
Copyright © 2011-2022 走看看