TypeError: 'type' object is not iterable - Iterating over object instances
TypeError: 'type' object is not iterable - Iterating over object instances
我正在做一个项目,我想让我的一个 classes 可迭代。据我所知,我可以使用 metaclass.
来做到这一点
首先我想了解 metaclass 是如何工作的。因此,我想展示我自己制作汽车的练习示例 class。所以在这里我想让我的 Car class 对象可迭代,然后我想在 main 函数中打印它们的名称。
代码示例如下:
__author__ = 'mirind4'
class IterableCar(type):
def __iter__(self):
return iter(self.__name__)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars.name)
但不幸的是我遇到了类型错误:
TypeError: 'type' object is not iterable
你能告诉我我的代码哪里出错了吗?到目前为止,我已经通过该站点和互联网检查过类似的问题,但我不知道问题出在哪里。我正在使用 python 3.4。
提前致谢!
据我所知,使用 metaclass 使 class 对象可迭代效果很好:
from __future__ import print_function
class IterableCar(type):
def __iter__(cls):
return iter(cls.__name__)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars)
结果:
mgilson$ python ~/sandbox/test.py
C
a
r
这是我实际跟踪生成的汽车的示例:
from __future__ import print_function
import weakref
class IterableCar(type):
_cars = weakref.WeakSet()
def __iter__(cls):
return iter(cls._cars)
def add_car(cls, car):
cls._cars.add(car)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.__class__.add_car(self)
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars.name)
请注意,如果您使用 python3.x,要使用 metaclass,您需要:
class Car(metaclass=IterableCar):
...
而不是:
class Car(object):
__metaclass__ = IterableCar
这可能解释了您遇到的问题。
要跟踪创建的 class 实例,我们首先要向元class 创建的每个 class 添加一个 _cars
属性。这将是一组弱引用,因此 class 本身不会阻止未使用的实例被垃圾收集。
class IterableCar(type):
def __new__(meta, name, bases, attrs):
attrs['_cars'] = weaker.WeakSet()
return type.__new__(meta, name, bases, attrs)
要添加实例,我们将覆盖 __call__
。本质上,这是您在定义 class 本身时通常会放在 __new__
或 __init__
中的代码。
def __call__(cls, *args, **kwargs):
rv = type.__call__(cls, *args, **kwargs)
cls._cars.add(rv)
return rv
并通过迭代其实例集使 class 可迭代,
def __iter__(self):
return iter(self._cars)
任何使用 IterableCar
的 class 将自动跟踪其实例。
class Car(metaclass=IterableCar):
def __init__(self, name):
self.name = name
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print(cars.name)
当装饰器需要元组时出现此错误,而我传入了一个没有尾随逗号的元素。
@api_view(["GET"])
@authentication_classes((CustomAuthentication,))
@permission_classes((AdminPermission))
def order_attached_documents_from_order_uuid(request):
# ...
return Response(status=status.HTTP_200_OK)
在我将 @permission_classes((AdminPermission))
更改为 @permission_classes((AdminPermission,))
之后,一切都开始正常工作了。
我正在做一个项目,我想让我的一个 classes 可迭代。据我所知,我可以使用 metaclass.
来做到这一点首先我想了解 metaclass 是如何工作的。因此,我想展示我自己制作汽车的练习示例 class。所以在这里我想让我的 Car class 对象可迭代,然后我想在 main 函数中打印它们的名称。
代码示例如下:
__author__ = 'mirind4'
class IterableCar(type):
def __iter__(self):
return iter(self.__name__)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars.name)
但不幸的是我遇到了类型错误:
TypeError: 'type' object is not iterable
你能告诉我我的代码哪里出错了吗?到目前为止,我已经通过该站点和互联网检查过类似的问题,但我不知道问题出在哪里。我正在使用 python 3.4。 提前致谢!
据我所知,使用 metaclass 使 class 对象可迭代效果很好:
from __future__ import print_function
class IterableCar(type):
def __iter__(cls):
return iter(cls.__name__)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars)
结果:
mgilson$ python ~/sandbox/test.py
C
a
r
这是我实际跟踪生成的汽车的示例:
from __future__ import print_function
import weakref
class IterableCar(type):
_cars = weakref.WeakSet()
def __iter__(cls):
return iter(cls._cars)
def add_car(cls, car):
cls._cars.add(car)
class Car(object):
__metaclass__ = IterableCar
def __init__(self, name):
self.__class__.add_car(self)
self.name = name
if __name__=='__main__':
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print (cars.name)
请注意,如果您使用 python3.x,要使用 metaclass,您需要:
class Car(metaclass=IterableCar):
...
而不是:
class Car(object):
__metaclass__ = IterableCar
这可能解释了您遇到的问题。
要跟踪创建的 class 实例,我们首先要向元class 创建的每个 class 添加一个 _cars
属性。这将是一组弱引用,因此 class 本身不会阻止未使用的实例被垃圾收集。
class IterableCar(type):
def __new__(meta, name, bases, attrs):
attrs['_cars'] = weaker.WeakSet()
return type.__new__(meta, name, bases, attrs)
要添加实例,我们将覆盖 __call__
。本质上,这是您在定义 class 本身时通常会放在 __new__
或 __init__
中的代码。
def __call__(cls, *args, **kwargs):
rv = type.__call__(cls, *args, **kwargs)
cls._cars.add(rv)
return rv
并通过迭代其实例集使 class 可迭代,
def __iter__(self):
return iter(self._cars)
任何使用 IterableCar
的 class 将自动跟踪其实例。
class Car(metaclass=IterableCar):
def __init__(self, name):
self.name = name
car1 = Car('Mercedes')
car2 = Car('Toyota')
for cars in Car:
print(cars.name)
当装饰器需要元组时出现此错误,而我传入了一个没有尾随逗号的元素。
@api_view(["GET"])
@authentication_classes((CustomAuthentication,))
@permission_classes((AdminPermission))
def order_attached_documents_from_order_uuid(request):
# ...
return Response(status=status.HTTP_200_OK)
在我将 @permission_classes((AdminPermission))
更改为 @permission_classes((AdminPermission,))
之后,一切都开始正常工作了。