GVKun编程网logo

Python-字典-修改__getitem__?(python字典的修改)

22

本文将分享Python-字典-修改__getitem__?的详细内容,并且还将对python字典的修改进行详尽解释,此外,我们还将为大家带来关于Pythonfor循环与__getitem__的关系记录

本文将分享Python-字典-修改__getitem__?的详细内容,并且还将对python字典的修改进行详尽解释,此外,我们还将为大家带来关于Python for循环与__getitem__的关系记录、python __getitem__ 魔法方法、python __iter__和__getitem__区别、python __set__ __get__ __delete__的相关知识,希望对你有所帮助。

本文目录一览:

Python-字典-修改__getitem__?(python字典的修改)

Python-字典-修改__getitem__?(python字典的修改)

好的,所以我建立了自己的变量处理程序,该处理程序具有__getitem__通过data
[key]访问数据时使用的功能,除了尝试访问项的链接时,它的工作原理非常好:

data["key"]["subkey"]


def __getitem__(self,key,**args):
    print key
    ...
    return self.dict[key]

当尝试访问一个不存在的子项时,Python只是返回一个KeyError而不打印“子项”,这是为什么?我如何才能使Python打印出我实际上想获取的内容?

我知道我可能误解了机制,但是有没有办法模仿字典并跟踪所请求的数据字符串?主要是为了让我可以动态地将丢失的变量记录在字典流中…

这显然可以工作(但是我不喜欢它的本机语法):

data["key:subkey"]

def __getitem__(self,**args):
    for slice in key.split(':'):
        print key
    ...

目标是模仿以下内容,

作品:

data = {'key' : {'subkey' : 1}}
print data["key"]["subkey"]

将无法正常工作,但是我想捕获其中的异常__getitem__,然后自动创建丢失的键,或者只记录丢失的子键:

data = {'key' : {}}
print data["key"]["subkey"]

解:

class Var():
    def __init__(self):
        self.dict = {'test' : {}}
    def __getitem__(self,var,**args):
        print ':',var
        if var in self.dict:
            v = Var(self.dict[var])
            return v

print vHandle['test']['down']

输出:

:测试

: 下

没有

Python for循环与__getitem__的关系记录

Python for循环与__getitem__的关系记录

一个类里面如果有__iter__,for循环就是找它取,没有的话就会找__getitem__。

如果自己定义类的话,我自己觉的还是先定义好__iter__比较好,因为如果调用__getitem__来执行循环读取速度也应该不会快,而且逻辑理解更加复杂。

前面一笔看过没有留心具体的执行情况。

In [169]: class Foo: 
     ...:     def __getitem__(self, pos): 
     ...:         print(pos) 
     ...:         return range(10)[pos] 
     ...:

 

In [172]: for i in f: 
     ...:     ... 
     ...:      
     ...:                                                                                          
0
1
2
3
4
5
6
7
8
9
10

当一个for循环或者list,tuple去读取该对象的数据时,

将会启动一个whileTrue的死循环,会从0开始迭代读取+1读取数据并根据return 返回。

如果没有设置StopIteration或者IndexError错误来停止循环,这是一个无法停下来的循环。

从代码可以看出,如果没有报错或者设置显式的条件,这个for循环会无线循环。

我现在设置一个显式的设置。

In [173]: class Foo: 
     ...:     def __getitem__(self, pos): 
     ...:         if pos >5: 
     ...:             raise StopIteration 
     ...:         print(pos) 
     ...:         return range(10)[pos] 
     ...:

 

In [177]: for i in f: 
     ...:     ... 
     ...:                                                                                          
0
1
2
3
4
5

 

将错误设置为IndexError也可以执行,但TypeError就不行了。

...:     def __getitem__(self, pos): 
     ...:         if pos >5: 
     ...:             raise IndexError 
     ...:         print(pos) 
     ...:         return range(10)[pos] 
     ...:                                                                                          

In [182]:                                                                                          

In [182]: f = Foo()                                                                                

In [183]: for i in f: 
     ...:     ... 
     ...:                                                                                          
0
1
2
3
4
5

 

如果用list去运行这个参数会把返回的一个一个元素,装入列表当中:

In [184]: list(f)                                                                                  
0
1
2
3
4
5
Out[184]: [0, 1, 2, 3, 4, 5]

 

只有__getitem__的类的实例是属于可迭代对象,但用isinstances测试collections.Iterable是不能通过的,书后面介绍可以通过iter函数来测试,如果没报错就说明是可迭代对象,然后生成一个没有__next__属性的迭代器。

 

In [185]: from collections import Iterable                                                         

In [186]: isinstance(f, Iterable)                                                                  
Out[186]: False

In [187]: iter(f)                                                                                  
Out[187]: <iterator at 0x114f2be50>

 

 

dir(f)                                                                                   
Out[189]: 
[''__class__'',
 ''__delattr__'',
 ''__dict__'',
 ''__dir__'',
 ''__doc__'',
 ''__eq__'',
 ''__format__'',
 ''__ge__'',
 ''__getattribute__'',
 ''__getitem__'',
 ''__gt__'',
 ''__hash__'',
 ''__init__'',
 ''__init_subclass__'',
 ''__le__'',
 ''__lt__'',
 ''__module__'',
 ''__ne__'',
 ''__new__'',
 ''__reduce__'',
 ''__reduce_ex__'',
 ''__repr__'',
 ''__setattr__'',
 ''__sizeof__'',
 ''__str__'',
 ''__subclasshook__'',
 ''__weakref__'']



python __getitem__ 魔法方法

python __getitem__ 魔法方法

Python的魔法方法__getitem__ 可以让对象实现迭代功能,这样就可以使用for...in... 来迭代该对象。

在用 for..in.. 迭代对象时,如果对象没有实现 __iter__ __next__ 迭代器协议,Python的解释器就会去寻找__getitem__ 来迭代对象,如果连__getitem__ 都没有定义,解释器就会报对象不是迭代器的错误:

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list

company = Company(["tom", "bob", "jane"])
for em in company:
    print(em)
TypeError: ''Company'' object is not iterable

而定义了这个魔法方法后,这个类或者这个类对象就变成了一个可以迭代对象,就可以正常迭代了。

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list

    def __getitem__(self, item):
        return self.employee[item]


company = Company(["tom", "bob", "jane"])
for em in company:
    print(em)

python __iter__和__getitem__区别

python __iter__和__getitem__区别

__getitem__

单独实现这个魔法函数,可以让这个类成为一个可迭代的对象,并且可以通过使用下标获取类中元素值下标的元素

class Library(object):
    def __init__(self):
        self.books = [1, 2, 3]
        self.index = -1

    def __getitem__(self, i):
        return self.books[i]

    # def __iter__(self):
    #     return self
    # #
    # def __next__(self):
    #     self.index += 1
    #     if self.index > len(self.books)-1:
    #         raise StopIteration()
    #     return self.books[self.index]


l = Library()
print(l[1])
for i in l:
    print(i)

 

__iter__

这个是返回一个可迭代的对象,如果一个类实现了这个魔法函数,那么这个类就是可迭代对象,并且实现了__next__这个魔法函数的话,可以通过for循环遍历;__next__如果单独实现了这一个魔法函数,只能通过next()调用

class Library(object):
    def __init__(self):
        self.books = [1, 2, 3]
        self.index = -1

    # def __getitem__(self, i):
    #     return self.books[i]

    def __iter__(self):
        return self
    # #
    def __next__(self):
        self.index += 1
        if self.index > len(self.books)-1:
            raise StopIteration()
        return self.books[self.index]


l = Library()
# print(l[1])
print(next(l))
for i in l:
    print(i)

 

python __set__ __get__ __delete__

python __set__ __get__ __delete__

class Attr(object):
    def __init__(self,attrname,attrtype):
        self.attrname=attrname
        self.attrtype=attrtype
    def __get__(self,instance,value): 
        return instance.__dict__[self.attrname]   
    def __set__(self,instance,value):
        if not isinstance(value,self.attrtype):
             raise TypeError("%s type error"%self.attrname)    
        instance.__dict__[self.attrname]=value
    def __delete__(self,instance):    
        del instance.__dict__[self.attrname]

class Person(object):
    name=Attr("name",str)
    age=Attr("age",int)        
p=Person()
p.age="23"

 

今天关于Python-字典-修改__getitem__?python字典的修改的分享就到这里,希望大家有所收获,若想了解更多关于Python for循环与__getitem__的关系记录、python __getitem__ 魔法方法、python __iter__和__getitem__区别、python __set__ __get__ __delete__等相关知识,可以在本站进行查询。

本文标签: