永不秃头的ssf 2019-01-22 16:38 采纳率: 0%
浏览 628
已采纳

类工厂函数中的一个问题(流畅的python书中的例子)

这是流畅的python一书中关于类工厂函数的代码:

    def factory(cls_name,field_name):
try:
    field_name=field_name.replace(',',' ').spilt(' ')
except AttributeError:
    pass
field_name=tuple(field_name)

def __init__(self,*args,**kwargs):
    attrs=dict(zip(self.__slots__,args))
    attrs.update(kwargs)
    for name,value in attrs.items():
        setattr(self,name,value)

def __iter__(self):
    for name in self.__slots__:
        yield getattr(self,name)

def __repr__(self):
    values=','.join('{}={!r}'.format(*i) for i in zip(self.__slots__,self))
    return '{}({})'.format(self.__class__.__name__,values)

cls_attrs=dict(__slots__=field_name,
               __init__=__init__,
               __iter__=__iter__,
               __repr__=__repr__)
return type(cls_name,(object,),cls_attrs)
Dog=factory('Dog','name weight owner')
dog=Dog('rex',30,'sunshuofeng')
print(dog)

我在运行时其报错了:

    Traceback (most recent call last):
 File "C:\Users\18022863809\Desktop\python_work\11.py", line 27, in <module>
Dog=factory('Dog','name weight owner')
File "C:\Users\18022863809\Desktop\python_work\11.py", line 26, in factory
return type(cls_name,(object,),cls_attrs)
TypeError: __slots__ must be identifiers

这是为什么?

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-01-23 00:12
    关注
    # encoding: utf-8
    
    
    def factory(cls_name,field_names):
        try:
            field_names=field_names.replace(',',' ').split()
        except AttributeError:
            pass
        field_names=tuple(field_names)
    
        def __init__(self,*args,**kwards):
            attrs=dict(zip(self.__slots__,args))
            attrs.update(kwards)
            for key,value in attrs.items():
                setattr(self,key,value)
    
        def __iter__(self):
            for name in self.__slots__:
                yield getattr(self,name)
        def __repr__(self):
            msg=', '.join('{}={!r}'.format(*i) for i in zip(self.__slots__,self))
            return '{}({})'.format(self.__class__.__name__,msg)
    
        cls_attrs=dict(__slots__=field_names,
                       __init__=__init__,
                      __iter__=__iter__,
                       __repr__=__repr__)
    
        return type(cls_name,(object,),cls_attrs)
    
    Dog=factory('Dog','name weight owner')
    dog=Dog('rex',30,'sunshuofeng')
    print(dog)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable