zoukankan      html  css  js  c++  java
  • a few python special functions:__getitem__

    1、__getitem__

    原文文档:For instance, if a class defines a method named__getitem__(), and x is an instance of this class, then x[i] is roughly equivalent tox.__getitem__(i) for old-style classes and type(x).__getitem__(x, i) for new-style classes. Except where mentioned, attempts to execute an operation raise an exception when no appropriate method is defined (typically AttributeError or TypeError).

     

    Dive into python:

           除了普通的类方法,Python 类还可以定义专用方法。专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用 (像普通的方法那样)。就像你在上一节所看到的,普通的方法对在类中封装字典很有帮助。但是只有普通方法是不够的,因为除了对字典调用方法之外,还有很多事情可以做的。例如,你可以通过一种没有包括明确方法调用的语法来获得和设置数据项。这就是专用方法产生的原因:它们提供了一种方法,可以将非方法调用语法映射到方法调用上。

    例 5.12. __getitem__ 专用方法

        def __getitem__(self, key): return self.data[key]
    >>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
    >>> f
    {'name':'/music/_singles/kairo.mp3'}
    >>> f.__getitem__("name") 1
    '/music/_singles/kairo.mp3'
    >>> f["name"]             2
    '/music/_singles/kairo.mp3'

    (1)  __getitem__ 专用方法很简单。像普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。但是怎么调用它呢?哦,你可以直接调用 __getitem__,但是在实际中你其实不会那样做:我在这里执行它只是要告诉你它是如何工作的。正确地使用 __getitem__ 的方法是让 Python 来替你调用。
    (2)  这个看上去就像你用来得到一个字典值的语法,事实上它返回你期望的值。下面是隐藏起来的一个环节:暗地里Python 已经将这个语法转化为 f.__getitem__("name") 的方法调用。这就是为什么 __getitem__ 是一个专用类方法的原因,不仅仅是你可以自已调用它,还可以通过使用正确的语法让 Python 来替你调用。

    Example 5.13. The __setitem__ Special Method

        def __setitem__(self, key, item): self.data[key] = item
    >>> f
    {'name':'/music/_singles/kairo.mp3'}
    >>> f.__setitem__("genre", 31) (1)
    >>> f
    {'name':'/music/_singles/kairo.mp3', 'genre':31}
    >>> f["genre"] = 32            (2)
    >>> f
    {'name':'/music/_singles/kairo.mp3', 'genre':32}
    (1)  与 __getitem__ 方法一样,__setitem__ 简单地重定向到真正的字典 self.data ,让它来进行工作。并且像 __getitem__ 一样,通常你不会直接调用它,当你
    使用了正确的语法,Python 会替你调用 __setitem__ 。
    (2)  这个看上去像正常的字典语法,当然除了 f 实际上是一个类,它尽可能地打扮成一个字典,并且 __setitem__ 是打扮的一个重点。这行代码实际上暗
    地里调用了 f.__setitem__("genre", 32)。
    用 __getitem__ 和 __setitem__ 可以实现 C# 索引器的功能。
    >>> class Class1:
        def __init__(self):
            self.__x = ["a", "b", "c"]
        def __getitem__(self, key):
            return self.__x[key]
        def __setitem__(self, key, value):
            self.__x[key] = value
    
    >>> a = Class1()
    >>> a[1]
    'b'
    >>> a[1] = "xxxx"
    >>> a[1]
    'xxxx'
     
    __delitem__ 在调用 del instance[key] 时调用 ,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用 del 时,Python 替你调用 __delitem__ 专用方法。
    class A: 
         def __delitem__(self, key): 
             print 'delete item:%s' %key 
      
    a = A() 
    del a['key']

  • 相关阅读:
    WPF如何判断PNG中的点是透明的
    Silverlight DataGrid自适应数据
    DEVExpress For WPF 中GridControl如何实现滚动分页(延迟查询)
    如何通过样式来处理根据自身其他属性内容赋值其他属性值的方法研究
    最近涉及到的一些需要备忘的东西
    (转载)Setup Factory 会话变量
    (转载)解决WPF动画属性锁死问题
    WPF InkCanvas MouseDown及MouseLeftButtonDown事件不触发的代替事件
    在win7与XP系统下 C#缺省路径不同
    Xamarin笔记
  • 原文地址:https://www.cnblogs.com/lovemo1314/p/2032485.html
Copyright © 2011-2022 走看看