精华内容
下载资源
问答
  • 主要介绍了Python方法getitem和getattr详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • __getitem__是Python双下划线包围的special method之一,这里我们就来解析Python中的__getitem__专有方法的使用,需要的朋友可以参考下:
  • python 的魔术方法 getitem setitem https://docs.python.org/3/reference/datamodel.html?highlight=iter#object.__getitem__ https://blog.csdn.net/weixin_42557907/article/details/81589574 class Tag: &...

    python 中的魔术方法 getitem setitem

    https://docs.python.org/3/reference/datamodel.html?highlight=iter#object.__getitem__
    https://blog.csdn.net/weixin_42557907/article/details/81589574

    class Tag:
        """
    
    
        tag = Tag()
        tag['name']  --->   __getitem__
    
        """
    
        def __getitem__(self, item):
            """
    
            :param item:
            :return:
            """
            print(f'__getitem__({item})  is  called.')
            return 2
    
    
    def test_tag():
        tag = Tag()
    
        # __getitem__ is called
        print(tag['name'])  # 2
        print(tag['frank'])  # 2
        print(tag['laoda'])  # 2
    
    
    if __name__ == '__main__':
        test_tag()
    

    __getitem__ 这个方法被调用的时候 是执行 tag[key]的时候,

    • __setitem__

    这个方法 是 怎么用呢?

    当实例 instance[‘key’] =‘frank’ ,这个时候会被调用.

    
    class Tag:
        """
    
    
        tag = Tag()
    
        tag['name']  --->   __getitem__
    
        tag['name'] ='frank'   ----> __setitem__
    
        """
    
        def __getitem__(self, item):
            """
    
            :param item:
            :return:
            """
            print(f'__getitem__({item})  is  called.')
            return self.__dict__[item]
    
        def __setitem__(self, key, value):
            print("__setitem__:Set %s Value %s" % (key, value))
    
            self.__dict__[key] = value
    
    
    
    
    if __name__ == '__main__':
        tag = Tag()
    
        #  __setitem__ 被调用
        tag['name'] = 'frank'
        tag['laoda'] = 'liuxiaolu'
        tag['laoer'] = 'lile'
        tag['laosan'] = 'weiliang'
    
        # __getitem__  被调用
        print(tag['name'])
        print(tag['laoda'])
        print(tag['laoer'])
        print(tag['laosan'])
    

    result:

    __setitem__:Set name Value frank
    __setitem__:Set laoda Value liuxiaolu
    __setitem__:Set laoer Value lile
    __setitem__:Set laosan Value weiliang
    __getitem__(name)  is  called.
    frank
    __getitem__(laoda)  is  called.
    liuxiaolu
    __getitem__(laoer)  is  called.
    lile
    __getitem__(laosan)  is  called.
    weiliang
    
    
    • __delitem__ 这个魔术方法 是什么时候调用呢?

    删除一个 实例的属性的时候

    比如 说 : del tag[‘name’] 就会调用 这个方法__delitem__

    class Tag:
        """
        tag = Tag()
    
        tag['name']  --->   __getitem__
    
        tag['name'] ='frank'   ----> __setitem__
    
        del tag['name']  ---->  __delitem__
        """
    
        def __getitem__(self, item):
            """
    
            :param item:
            :return:
            """
            print(f'__getitem__({item}) is  called.')
            return self.__dict__[item]
    
        def __setitem__(self, key, value):
            print(f"__setitem__:Set {key},Value {value}")
    
            self.__dict__[key] = value
    
        def __delitem__(self, key):
            print(f"__delitem__({key}) is called")
            del self.__dict__[key]
    
    
    
    
    if __name__ == '__main__':
        tag = Tag()
    
        #  __setitem__ 被调用
        tag['name'] = 'frank'
        tag['laoda'] = 'liuxiaolu'
        tag['laoer'] = 'lile'
        tag['laosan'] = 'weiliang'
    
        # __getitem__  被调用
        print(tag['laosan'])
    
        #  __delitem__  被调用
        del tag['laosan']
    
        try:
            print(tag['laosan'])
        except KeyError:
            print('key error occurred.')
    

    result:

    __setitem__:Set name,Value frank
    __setitem__:Set laoda,Value liuxiaolu
    __setitem__:Set laoer,Value lile
    __setitem__:Set laosan,Value weiliang
    __getitem__(laosan)  is  called.
    weiliang
    __delitem__(laosan) is called
    __getitem__(laosan)  is  called.
    key error occurred.
    
    
    总结

    python 中有很多魔术方法,主要探讨了__getitem__ , __setitem__ , __delitem__
    这些魔术方法的基本使用. 其实 很多时候 有一些库里会使用这些魔术方法,这个时候 要去理解他们为什么 要实现这些方法, 这个就是python 的特性了, 需要不断的学习吧.
    推荐阅读有一个实现
    https://github.com/requests/requests/blob/master/requests/structures.py
    CaseInsensitiveDict 对大小写不敏感的字典的实现,里面就有用了这几个魔术方法.

    参考文档

    https://github.com/requests/requests/blob/master/requests/structures.py
    https://docs.python.org/3/reference/datamodel.html?highlight=iter#object.__getitem__
    https://blog.csdn.net/weixin_42557907/article/details/81589574

    分享快乐,留住感动. 2018-12-30 19:30:39 --frank
    展开全文
  • 1、getitem 方法 使用这个方法最大的印象就是调用对象的...使用括号对对象的属性进行取值、赋值或者删除时,会自动触发对应的__getitem__、__setitem__、__delitem__方法 代码如下: class Foo(object): de...

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习

    1、getitem 方法

    使用这个方法最大的印象就是调用对象的属性可以像字典取值一样使用中括号['key']

    使用中括号对对象中的属性进行取值、赋值或者删除时,会自动触发对应的__getitem__、__setitem__、__delitem__方法

    代码如下:

    class Foo(object):
      def __init__(self):
        self.name = 'jack'
    

    def getitem(self,item):
    if item in self.dict: # item = key,判断该key是否存在对象的 dict 里,
    return self.dict[item] # 返回该对象 dict 里key对应的value

    def setitem(self, key, value):
    self.dict[key] = value # 在对象 dict 为指定的key设置value

    def delitem(self, key):
    del self.dict[key] # 在对象 dict 里删除指定的key

    f1 = Foo()
    print(f1[‘name’]) # jack
    f1[‘age’] =10
    print(f1[‘age’]) # 10
    del f1[‘name’]
    print(f1.dict) # {‘age’: 10}

    2、getattr 方法

    使用对象取值、赋值或者删除时,会默认的调用对应的__getattr__、__setattr__、__delattr__方法。

    对象取值时,取值的顺序为:先从object里__getattribute__中找,第二步从对象的属性中找,第三步从当前类中找,第四步从父类中找,第五步从__getattr__中找,如果没有,直接抛出异常。

    代码如下:

    class Foo(object):
      def __init__(self):
        self.name = 'jack'
    

    def getattr(self, item):
    if item in self.dict:
    return self.dict[item]

    def setattr(self, key, value):
    self.dict[key] = value

    def delattr(self, item):
    del self.dict[item]

    c1 = Foo()
    print(c1.name) # jack
    c1.age = 18
    print(c1.age) # 18
    del c1.age # 删除 对象c1的age
    print(c1.age) # None

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

                        <p><p></td></tr></table>
    
    原文地址是:http://www.piaodoo.com/thread-13845-1-2.html
    展开全文
  • python中__getitem__函数

    千次阅读 2019-03-27 21:44:16
    如果在类定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类的__getitem__()方法。 def __getitem__(self, rand_vid): ...

    如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。

    def __getitem__(self, rand_vid):

     

    展开全文
  • 12345678def __getitem__(self, key):return self.data[key]>>> f= fileinfo.FileInfo("/music/_singles/kairo.mp3")>>> f{'name':'/music/_singles/kairo.mp3'}>>> f.__getitem__("name")'/mus...

    1

    2

    3

    4

    5

    6

    7

    8

    def __getitem__(self, key):return self.data[key]

    >>> f= fileinfo.FileInfo("/music/_singles/kairo.mp3")

    >>> f

    {'name':'/music/_singles/kairo.mp3'}

    >>> f.__getitem__("name")

    '/music/_singles/kairo.mp3'

    >>> f["name"]

    '/music/_singles/kairo.mp3'

    (1) __getitem__ 专用方法很简单。像普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。但是怎么调用它呢?哦,你可以直接调用 __getitem__,但是在实际中你其实不会那样做:我在这里执行它只是要告诉你它是如何工作的。正确地使用 __getitem__ 的方法是让 Python 来替你调用。

    (2) 这个看上去就像你用来得到一个字典值的语法,事实上它返回你期望的值。下面是隐藏起来的一个环节:暗地里Python 已经将这个语法转化为 f.__getitem__("name") 的方法调用。这就是为什么 __getitem__ 是一个专用类方法的原因,不仅仅是你可以自已调用它,还可以通过使用正确的语法让 Python 来替你调用。

    使用slice切片对象

    list有个神奇的切片方法:

    1

    2

    >>>range(100)[5:10]

    [5,6,7,8,9]

    对于Fib却报错。原因是__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    class Fib(object):

    def __getitem__(self, n):

    if isinstance(n,int):

    a, b= 1,1

    for xin range(n):

    a, b= b, a+ b

    return a

    if isinstance(n,slice):

    start= n.start

    stop= n.stop

    a, b= 1,1

    L= []

    for xin range(stop):

    if x >= start:

    L.append(a)

    a, b= b, a+ b

    return L

    现在试试Fib的切片:

    1

    2

    3

    4

    5

    >>> f= Fib()

    >>> f[0:5]

    [1,1,2,3,5]

    >>> f[:10]

    [1,1,2,3,5,8,13,21,34,55]

    但是没有对step参数作处理:

    1

    2

    >>> f[:10:2]

    [1,1,2,3,5,8,13,21,34,55,89]

    也没有对负数作处理,所以,要正确实现一个__getitem__()还是有很多工作要做的。

    此外,如果把对象看成dict,__getitem__()的参数也可能是一个可以作key的object,例如str。

    与之对应的是__setitem__()方法,把对象视作list或dict来对集合赋值。最后,还有一个__delitem__()方法,用于删除某个元素。

    总之,通过上面的方法,我们自己定义的类表现得和Python自带的list、tuple、dict没什么区别,这完全归功于动态语言的"鸭子类型”,不需要强制继承某个接口。

    展开全文
  • Python中想要使类的实例像list一样使用下标,可以用__getitem__方法,而配合slice对象则可以实现list一样的切片,详解Python中的__getitem__方法与slice对象的切片操作
  • 问题:python__getitem__的终止条件是什么 在深度学习训练经常在dataset看到__getitem__自定义的迭代器,但是到底迭代器含有多少个可迭代对象呢,今天试验了一下 例1: class Dataset(object): def __...
  • 参考文献 [1]python getitem()方法理解
  • 当实例x出现在x[i]这样的索引运算时,Python会调用这个实例继承的__getitem__方法(如果有的话),把x作为第一个参数传递,并且方括号内的索引值传给第二个参数。例如,下面的类将返回索引值的平方。 #!/usr/...
  • 一句话理解python__getitem__方法 python的__getitem__方法,可以将实例化的类,实现字典dict的键值形式。 class A(object): def __init__(self): super(A, self).__init__() def __getitem__(self, ...
  • python __getitem__()

    2019-11-06 20:52:23
    如果在类定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类的__getitem__()方法。 # -*- coding:utf-8 -*- class DataTest: def __init__...
  • 关于python_getitem_()方法的坑

    千次阅读 2018-12-27 22:59:16
    我们处理数据时,可能会将数据用类的方式取出来,并且我们在使用这些数据时...dataset['key'] 这样的方式取出,此时如果在_getitem_()方法里加入一些需要临时进行的操作(比如图像降采样)可以使数据处理变得灵活。...
  • python __getitem__()方法理解

    万次阅读 多人点赞 2017-10-26 15:52:25
    如果在类定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类的__getitem__()方法。 # -*- coding:utf-8 -*- class DataTest: def __init__...
  • python中的特殊方法 __getitem__() 原创Solarzhou 最后发布于2019-07-19 14:08:37 阅读数 1240 收藏 展开 特殊方法----getitem() Python的特殊方法__getitem_() 主要作用是可以让对象实现迭代功能。我们通过一个实例...
  • python __getitem__() 方法

    千次阅读 2018-11-22 08:54:30
    如果在类定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类的__getitem__()方法。 class DataTest: def __init__(self,id,address): self.id...
  • 如果在类定义了__getitem__()方法,那么它的实例对象(假设为P)就可以以P[key]形式取值,当实例对象做P[key]运算时,就会调用类的__getitem__()方法。当对类的属性进行下标的操作时,首先会被__getitem__() ...
  • 问题:那__getitem__可以替代__iter__方法吗 1.list # -*- coding: utf-8 -*- class Library(object): def __init__ (self): self.books = [ ' title ' , ' a ' , ' title2 ' , ' b ' , ' ...
  • Python __getitem__和自定义的迭代器

    千次阅读 2014-12-13 17:20:20
    __getitem__拦截索引运算符:当实例X出现在X【i】这样的索引运算时,Python会调用这个实例继承的__getitem__方法(如果有的话)把X作为第一个参数传递,并且方括号内的索引值传给第二个参数 >>> class ...
  • 参考: 伯乐地址用于索引...以上分别表示获取、设置、删除数据#Python __doc__ class C(object): """ Holy Shit What The Fuck """ def __init__(self): self.value = {} self.name = 'WuPeiQi' def __getitem__
  • class sl(object): def __getitem__(self, n): if isinstance(n, slice): print(n.start) print(n.stop) s = sl() s[0:9] 0 9 说明: 当有判断isinstance(n, slice):时,n才会有start和sto...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 534
精华内容 213
关键字:

python中getitem

python 订阅