本文将分享Python-字典-修改__getitem__?的详细内容,并且还将对python字典的修改进行详尽解释,此外,我们还将为大家带来关于Pythonfor循环与__getitem__的关系记录
本文将分享Python-字典-修改__getitem__?的详细内容,并且还将对python字典的修改进行详尽解释,此外,我们还将为大家带来关于Python for循环与__getitem__的关系记录、python __getitem__ 魔法方法、python __iter__和__getitem__区别、python __set__ __get__ __delete__的相关知识,希望对你有所帮助。
本文目录一览:- Python-字典-修改__getitem__?(python字典的修改)
- Python for循环与__getitem__的关系记录
- python __getitem__ 魔法方法
- python __iter__和__getitem__区别
- python __set__ __get__ __delete__
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__的关系记录
一个类里面如果有__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__ 可以让对象实现迭代功能,这样就可以使用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__区别
__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__
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__等相关知识,可以在本站进行查询。
本文标签: