迭代器定义
迭代器类型
-
类中定义
__iter__
和
__next__
两个方法 -
__iter__
返回对象本身 -
__next__
返回下一个数据,无数据排除StopIteration异常
创建迭代器类型
class Iter(object):
def __init__(self):
self.counter = 0
def __iter__(self):
return self
def __next__(self):
self.counter += 1
if self.counter == 3:
return StopIteration()
return self.counter
在python的for循环中也是
__iter__
获取迭代器对象,然后通过next对象获取数据。
可迭代对象
类的
__iter__
方法返回一个迭代对象
常见的list,turple都是可迭代对象,从
__iter__
找到迭代器类型对象
class Foo():
def __iter__(self):
return iterObj # 迭代器对象
obj=Foo()
# 可迭代对象可以for循环
for item in obj:
pass
————————————————————————————
元类
使用type创建类
创建对象的过程
- 执行new方法,创建空对象
- init进行初始化
class Foo(object):
def __init(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
data = object.__new__(cls)
return data
而类默认是由type创建的
使用type类型创建类Foo
# 1
class Foo(object):
v1 = 1
def func(self):
return 2
# 2
Foo1 = type('Foo', (object,), {'v1': 2, 'func': lambda self: 666})
obj = Foo1()
print obj.v1, obj.func()
# 输出:2, 666
元类指定创建
class MyType(type):
def __init__(self, *args, **kwargs):
super(MyType, self).__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
new_cls = super(MyType, cls).__new__(cls, *args, **kwargs)
# 创建Foo即输出 <class '__main__.Foo'>
print new_cls
return new_cls
def __call__(self, *args, **kwargs):
# 调用self的__new__创建对象, self就代表是Foo对象
print 'Foo create'
empty_object = self.__new__(self)
# 调用self的__init__初始化
self.__init__(empty_object, *args, **kwargs)
return empty_object
# Foo类相当于MyType的一个对象
class Foo(object):
__metaclass__ = MyType
def __init__(self):
print 'Foo init'
#####################################
# 在Foo实例化时,会执行MyType的call方法
# 随之进行Foo的new和init
#####################################
f = Foo()
打印输出
– <class ‘
main
.Foo’>
– Foo create
– Foo init
元类实现单例模式
思路就是在元类中判断
instance
是否创建
class SingleType(type):
def __init__(self, *arg, **kwargs):
self.instance = None
def __call__(self, *args, **kwargs):
if not self.instance:
self.instance = self.__new__(self)
self.__init__(self.instance, *args, **kwargs)
return self.instance
class SingleClass(object):
__metaclass__ = SingleType
class MyClass(SingleClass):
pass
obj1 = MyClass()
obj2 = MyClass()
print obj1
print obj2
输出结果,
obj1
和
obj2
是单例类的对象,工程中只需要继承
SingleClass
就可以创建其他单例类
– <
main
.MyClass object at 0x000000000382B888>
– <
main
.MyClass object at 0x000000000382B888>