展开

关键词

__getitem__

实现了__iter__()的实例虽能用于for循环,看似像list,但并不能将其当做list来使用,比如,Fib()[5]还是报错 可通过实现__getitem__()方法,;来实现让实例像list 那样按照下标取出元素 实现按照下标取元素 class Fib(object): def __getitem__(self, n): a, b = 1, #输出:2 f[3] #输出:3 f[10] #输出:89 f[100] #输出:573147844013817084101 实现切片功能   __getitem __()传入的参数可能是一个int,也可能是一个切片对象slice,因此需要做判断   如果把对象看成dict,__getitem__()的参数也可能是一个可以作key的object,例如str , 5] f[:10] #输出:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] #该例没有对step参数作处理,也没有对负数作处理,所以,要正确实现一个__getitem

42410

python __getitem__()方法理解

如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。 self.id:1, self.address:"192.168.1.1" } def __getitem data=DataTest(1,"192.168.2.11") print data[2] 输出结果为:hello 在这我认为实例对象的key不管是否存在都会调用类中的__getitem 而且返回值就是__getitem__()方法中规定的return值。

1.1K50
  • 广告
    关闭

    腾讯云服务器买赠活动

    腾讯云服务器买赠活动,低至72元1年,买就送,最长续3个月,买2核送4核、买4核送8核

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python 类特殊方法__getitem__

    凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法__getitem__。 一般如果想使用索引访问元素时,就可以在类中定义这个方法(__getitem__(self, key) )。先用一个夸张一点的例子来说明这个问题。? 当实例对象通过[] 运算符取值时,会调用它的方法__getitem__,从上面代码中输出二个笑脸可以看出来。 self.d = {self.id: 1, self.address: "192.168.1.1", } def __getitem _(self, id, address): '''初始化方法''' self.id = id self.address = address def __getitem

    1.3K40

    python之使用魔术方法__getitem__和__len__

    (1)像__getitem__这种由两个双下划线构成的方法,被称为魔术方法。 (2)魔术方法是为了给python解释器用的。 (4)使用__getitem__和__len__方法,我们就可以实现一个对自定义数据类型的迭代和访问。 = [Card(rank,suit) for rank in self.ranks for suit in self.suits] def __getitem 自定义的FrenchDeck类在重写了__getitem__和__len__方法之后,就可以对FrenchDeck实例化的对象进行类似于列表的操作。 对合成的运用使得__len__和__getitem__的具体实现可以代理给self._card这个python列表。

    27220

    Python迭代和解析(4):自定义迭代

    例如: >>> slice(0,2) slice(0, 2, None) __getitem__ 列表、元组等序列之所以可以索引取值、分片取值,是因为它们实现了__getitem__方法。 例如: >>> hasattr(list,"__getitem__") True >>> hasattr(tuple,"__getitem__") True >>> hasattr(dict,"__getitem __") True >>> hasattr(str,"__getitem__") True 如果自定义类并实现__getitem__方法,它们会重载索引取值: class cls: def __getitem 分片和__getitem__ 如果想要__getitem__支持分片取值,需要在__getitem__中使用索引取值的方式,以便支持slice对象作为索引。 当同时定义了__iter__和__getitem__的时候,iter()函数优先选择__iter__,只有在__iter__不存在的时候才会选择__getitem__

    32000

    python2和3中zip的差异(坑)

    python2和3中的机制不同 class Foo(object): def __init__(self): self.items = range(3) def __getitem __(self, i): print('__getitem__', i) return self.items[i] foo1 = Foo() foo2 = Foo() print , foo2)) # for s1, s2 in zip(foo1, foo2): # print(s1, s2) python2 # 输出: # 提前已经遍历了一遍,组成新的列表了 ('__getitem __', 0) ('__getitem__', 0) ('__getitem__', 1) ('__getitem__', 1) ('__getitem__', 2) ('__getitem__', 2 ) ('__getitem__', 3) [(0, 0), (1, 1), (2, 2)] python3 # 输出: <zip object at 0x7f96933f9648> 可以看到python2

    21720

    Python进阶:自定义对象实现切片功能

    1、魔术方法:__getitem__() 想要使自定义对象支持切片语法并不难,只需要在定义类的时候给它实现魔术方法 __getitem__() 即可。所以,这里就先介绍一下这个方法。 interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the __getitem 概括翻译一下:__getitem__() 方法用于返回参数 key 所对应的值,这个 key 可以是整型数值和切片对象,并且支持负数索引;如果 key 不是以上两种类型,就会抛 TypeError;如果索引越界 特别需要说明的是,此例中的 __getitem__() 方法会根据不同的参数类型而实现不同的功能(取索引位值或切片值),也会妥当地处理异常,所以并不需要我们再去写繁琐的处理逻辑。 4、小结 本文介绍了__getitem__()魔术方法,并用于实现自定义对象(以列表类型和字典类型为例)的切片功能,希望对你有所帮助。

    55150

    Python中的魔法属性

    .: In [69]: f = Foo() In [70]: print(f) < Custom Foo object str > __getitem__、__setitem__、__delitem = dict() def __getitem__(self, key): print('__getitem__() ', key) return self.my_dict.get ]: mdict['name'] = 'jack' __setitem__() name jack In [42]: mdict['name'] __getitem__() name Out[42 [:] = [1,2,3] __getitem__() called slice(None, None, None) [1, 2, 3] In [74]: mlist[:] __getitem__() 3, 2, 1] In [77]: mlist[0] __getitem__() called 0 In [78]: mlist[0:1] __getitem__() called slice(0,

    25900

    Python 中几种属性访问的区别

    图 | 《借东西的小人阿莉埃蒂》剧照 起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__。 __get__(None, A) 其他情况见文末参考资料的文档 四、__getitem__ 方法 这个调用也属于无条件调用,这点与 __getattribute__ 一致。 区别在于 __getitem__ 让类实例允许 [] 运算,可以这样理解: __getattribute__适用于所有.运算符; __getitem__适用于所有 [] 运算符。 class A(object): a = 1 def __getitem__(self, item): print('__getitem__ call') __(self, item): print('__getitem__ call') return object.

    47730

    Python里最神秘的一个魔法函数

    __()取不到值时会被调用,但是,我不经意间还发现了一个细节:__getitem__()在取不到值时,并不一定会调用__missing__()。 __missing__() 是魔术方法的“二等公民”,它没有独立的调用入口,只能被动地由 __getitem__() 调用,即__missing__() 依赖于__getitem__()。 __missing__() 依赖于__getitem__(),才能实现方法调用;而 __getitem__() 也要依赖 __missing__(),才能实现完整功能。 为了实现这一点,__getitem__()在解释器代码中开了个后门,从 C 语言界面折返回 Python 界面,去调用那个名为“__missing__”的特定方法。 为了让字典类型有更强大的表现(或者说让__getitem__()作出 get() 那样的表现),Python 让字典的子类可以定义__missing__(),供__getitem__()查找调用。

    16150

    Python运算符重载

    调用函数        X() __getattr_    限制            X.undefine __setattr__    取值            X.any=value __getitem Number(20)y = number – 10 # invoke __sub__ method 7.2    迭代重载 Python代码 class indexer:    def __getitem __(self, i):    return self.data[i]    X = stepper()    X.data = 'Spam'   X[1] #call __getitem__    for item in X: #call __getitem__    print item   class stepper: def __getitem__(self, i): return self.data [i] X = stepper()X.data = 'Spam'X[1] #call __getitem__for item in X: #call __getitem__    print item

    29410

    python 魔术方法(一) 自定义容器类与类属性控制

    获取元素 — __getitem__ __getitem__(self, key) 对于容器来说,获取元素是最重要的操作,魔术方法 __getitem__就完成了这个工作,每当对对象通过[]操作符获取元素时 _cards) def __getitem__(self, position): return self. __missing__ __missing__(self, key) 如果你的类是一个继承自 dict 的字典类,并且你没有实现自己的 __getitem__ 方法,那么当默认的 __getitem__ 但是,需要注意的是,如果你自己实现了 __getitem__ 方法,并且没有调用父类的 __getitem__ 方法,那 __missing__ 将永远都不会被调用。 这有两种方法可以解决: 显式调用 使用父类 __getitem__ 4. 控制类属性的访问 4.1.

    9320

    Python中的魔法属性

    = dict() def __getitem__(self, key): print('__getitem__() ', key) return self.my_dict.get ]: mdict['name'] = 'jack' __setitem__() name jack In [42]: mdict['name'] __getitem__() name Out[42 [:] = [1,2,3] __getitem__() called slice(None, None, None) [1, 2, 3] In [74]: mlist[:] __getitem__() called slice(None, None, None) Out[74]: [1, 2, 3] In [75]: mlist[0:2] __getitem__() called slice(0, 3, 2, 1] In [77]: mlist[0] __getitem__() called 0 In [78]: mlist[0:1] __getitem__() called slice(0,

    13820

    Python中的魔法属性

    = dict() def __getitem__(self, key): print('__getitem__() ', key) return self.my_dict.get ]: mdict['name'] = 'jack' __setitem__() name jack In [42]: mdict['name'] __getitem__() name Out[42 [:] = [1,2,3] __getitem__() called slice(None, None, None) [1, 2, 3] In [74]: mlist[:] __getitem__() called slice(None, None, None) Out[74]: [1, 2, 3] In [75]: mlist[0:2] __getitem__() called slice(0, 3, 2, 1] In [77]: mlist[0] __getitem__() called 0 In [78]: mlist[0:1] __getitem__() called slice(0,

    15720

    django MultiValueDictKeyError at *...*

    __getitem__ (*key*)[¶](http://python.usyiyi.cn/documents/django_182/ref/request-response.html#django.http.QueryDict 如果key 具有多个值,__getitem__() 返回最新的值。如果key 不存在,则引发django.utils.datastructures.MultiValueDictKeyError 。 image.png 解决方法: QueryDict. get (*key*, *default*) 使用与上面__getitem__() 相同的逻辑,但是当key 不存在时返回一个默认值。

    83520

    Python学习——数据模型特殊方法

    如len(object)调用了__len__特殊方法,list[]调用了__getitem__方法。 self): #重写__len__方法 return 1 if __name__=="__main__": t = Test() print(len(t)) #输出为1 __getitem = [Card(rank,suit) for rank in self.ranks for suit in self.suits] def __getitem _cards[item] if __name__=="__main__": deck = FrenchDeck() print(deck[0]) #使用deck[0]时会调用__getitem __方法,解释器会将0传递给__getitem__(self, item)中的item参数 print(deck[1:4]) #使用切片操作时也会调用__getitem__方法,解释器会传递slice

    17710

    python 接口 、继承、重载运算符

    序列`__getitem__` 2. `__setitem__` 3. 抽象基类 4. 不要直接子类化内置类型 5. 继承顺序 6. 重载运算符 learn from 《流畅的python》 1. 序列__getitem__ 如果没有 __iter__ 和 __contains__ 方法, Python 会调用 __getitem__ 方法, 设法让 迭代 和 in 运算符可用 class Foo: def __getitem__(self, pos): return range(0, 30, 10)[pos] f = Foo() print(f[1]) # 10 for i in f: print(i) # 0, 10, 20 # 如果没有 __iter__ 和 __contains__ 方法, # Python 会调用 __getitem__ _cards) def __getitem__(self, position): return self.

    13130

    流畅的Python 1. Python数据模型(特殊方法 __func__())

    `__getitem__()、__len__()` 方法 2. 特殊方法 1. __getitem__()、__len__() 方法 举一个扑克牌的例子 import collections Card = collections.namedtuple('Card_name', [ _cards) def __getitem__(self, pos): return self. _cards[pos] deck = FrenchDeck() print(len(deck)) # 13*4=52 print(deck[0]) # [] 调用 __getitem__ 方法 Card_name(rank='J', suit='diamonds') print(choice(deck)) # Card_name(rank='3', suit='clubs') # __getitem

    10620

    python的抽象基类

    我们定义一个类: class test1(): def __getitem__(self,pos): return range(3)[pos] a = test1() a[1] Out[13]: 1 2 in a Out[14]: True for i in a: print(i) 0 1 2 在这个类,我们只是实现了__getitem__,python自动就帮你实现了迭代 但是我们应用在上面那个例子: class test1(): def __init__(self): self.alist = list(range(20)) def __getitem __,__len__ __contains__,__iter__,__reversed__,index,and count MutableSequence Sequence __getitem__,_ __,__iter__,__len__ __contains__,keys,items,values,get,__eq__,and __ne__ MutableMapping Mapping __getitem

    22310

    相关产品

    • 腾讯智慧建筑管理平台

      腾讯智慧建筑管理平台

      腾讯智慧建筑管理平台(微瓴)是深度适配智慧建筑场景的物联网类操作系统,针对于建筑内的硬件、应用等资源,提供物联、管理与数字服务,赋予建筑综合协同的智慧能力,并为建筑管理运营者与建筑业主方提供安全、高效、便利的建筑综合管理运营系统……

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券