python向lis添加类对象

2024-06-01 09:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个类对象的空实例并将其添加到列表中,但是,当我尝试创建对象并添加新数据时,我得到一个错误,如下所示:

错误

Traceback (most recent call last):
  File "pagerduty.py", line 96, in <module>
    UserData = User()
TypeError: 'dict' object is not callable

代码

class User(object):
    __attrs = ['Policy','Level', 'StartDate', 'EndDate', 'StartTime',
               'EndTime', 'Name', 'Mobile']

    def __init__(self, **kwargs):
        for attr in self.__attrs:
            setattr(self, attr, kwargs.get(attr, None))

    def __repr__(self):
        return ', '.join(
            ['%s: %r' % (attr, getattr(self, attr)) for attr in self.__attrs])  

OnCallData = [] 
for User in objPolicyData['users']: 
    UserData = User()     
    UserData.Name = User['name']
    UserData.Mobile = UserMobile = getUserMobile(User['id']) 
    for OnCall in User['on_call']:    
        UserPolicy = OnCall['escalation_policy'] 
        PolicyName = UserPolicy['name']
        if PolicyName.lower().find('test') == -1:
            UserData.Policy = PolicyName
            UserData.Level = OnCall['level']
            UserData.StartDate = getDate(OnCall['start'])
            UserData.EndDate = getDate(OnCall['end'])
            UserData.StartTime = getTime(OnCall['start'])
            UserData.EndTime = getTime(OnCall['end'])    
OnCallData.append(UserData)

Tags: inselfforobject错误policycalllevel
2条回答

您的类和您正在迭代的变量都称为User。把其中一个换成另一个名字

根据python的惯例,变量名是小写的。所以我建议做如下改变:

for user in objPolicyData['users']: 
    user_data = User()     
    user_data.name = User['name']
    user_data.mobile = UserMobile = getUserMobile(User['id']) 
    for on_call in User['on_call']:    
        user_policy = on_call['escalation_policy'] 
        policy_name = user_policy['name']
        if policy_name.lower().find('test') == -1:
            user_data.policy = policy_name
            user_data.level = on_call['level']
            user_data.start_date = get_date(on_call['start'])

等等。这遵循pep8中的命名约定。这也会解决你的错误

当然,如果已经有了一个已建立的样式指南,那么您应该按照它来决定一个不同的名称User(迭代变量)

for范围内,User标识符是来自objPolicyData['users']的迭代值(正如您在UserData.Name = User['name']中使用的那样)

您需要为迭代使用不同的名称。
类似于:

for userI in objPolicyData['users']: 
    UserData = User()     
    UserData.Name = userI['name']
    UserData.Mobile = UserMobile = getUserMobile(userI['id']) 
    for OnCall in userI['on_call']:    
        UserPolicy = OnCall['escalation_policy'] 
        PolicyName = UserPolicy['name']
        if PolicyName.lower().find('test') == -1:
            UserData.Policy = PolicyName
            UserData.Level = OnCall['level']
            UserData.StartDate = getDate(OnCall['start'])
            UserData.EndDate = getDate(OnCall['end'])
            UserData.StartTime = getTime(OnCall['start'])
            UserData.EndTime = getTime(OnCall['end'])  

请注意,使用约定可以为您防止此错误。意思是,以小写字母(user)开始变量名,以大写字母(User)开始类名。
这与大多数变量名有关

相关问题 更多 >