2016-04-28 99 views
0

我创建了一个新类,我试图动态添加到该类中, 我创建了一个列表,我想要放入多个对象,然后我将遍历名单在Django(这是做事的正确方法是什么?)动态添加到类

,但我发现下面的错误

TypeError: __init__() takes exactly 9 arguments (1 given) 

我知道是什么错误意味着,我只是不知道如何去创造我的对象的一个​​新实例,并轻松地添加到它的飞行?

### create User Object 
class User: 
    def __init__(self, Policy, Level, StartDate, EndDate, StartTime, EndTime, Name, Mobile): 
     self.Policy = Policy 
     self.Level = Level 
     self.StartDate = StartDate 
     self.EndDate = EndDate 
     self.StartTime = StartTime 
     self.EndTime = EndTime 
     self.Name = Name 
     self.Mobile = Mobile 
    def __init__(self): 
     pass  


### Get all the Polices ### 
lstOnCall = [] 
for objPolicy in objPolicyData['escalation_policies']: 
    strPolicyName = objPolicy['name'] 
    if strPolicyName.lower().find('test') == -1: 
     for objOnCall in objPolicy['on_call']: 
      objUser = User() 
      objUser.Policy = strPolicyName 
      objUser.Level = objOnCall['level'] 
      objUser.StartDate = getDate(objOnCall['start']) 
      objUser.EndDate = getDate(objOnCall['end']) 
      objUser.StartTime = getTime(objOnCall['start']) 
      objUser.EndTime = getTime(objOnCall['end']) 
      objUser = objOnCall['user'] 
      objUser.Name = objUser['name'] 
      objUser.Mobile = getUserMobile(objUser['id']) 
      lstOnCall.append(objUser) 
print lstOnCall 

UPDATE: 添加下面的作品,我只需要知道如何现在打印的项目?

def __init__(self): 
     pass 

以下

for item in lstOnCall:   
    print item() 

回报

print item() 
AttributeError: User instance has no __call__ method 
+0

它是Python 2中的“print item”和Python 3中的print(item)。不知道'item'后面括号的含义是什么。 – BallpointBen

+0

我不确定你想要做什么。另外,你不需要两个inits。如果你的班级带参数,你应该按照詹姆斯的建议去做。 –

+0

虽然我不确定你为什么不立即通过它们。你有那里的数据;所以为什么不做'objUser = User(strPolicyName,objOnCall ['level'],getDate(objOnCall ['start'])....)'? –

回答

3

您可以编写一个动态构造()为您的类,以便:

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]) 
  • 变量__attrs存储变量名称。我使用了双下划线变量,因此从扩展中无法访问。
user = User() 
print(user.__attrs) 
Traceback (most recent call last): 
    print(user.__attrs) 
AttributeError: 'User' object has no attribute '__attrs' 

是的,还有其他的方法来访问双下划线变量,但没有人能做到这一点;)

  • 功能__repr__通过调用printstr返回string ,如果功能__str__不存在。

现在测试一下

>>> u1 = User(Name='user1') 
>>> u2 = User(Name='user2', Policy=1, Level=3) 
>>> print(u1) 
Policy: None, Level: None, StartDate: None, EndDate: None, StartTime: None, EndTime: None, Name: 'user1', Mobile: None 
>>> print(u2) 
Policy: 1, Level: 3, StartDate: None, EndDate: None, StartTime: None, EndTime: None, Name: 'user2', Mobile: None 

如果你用我的代码,你可以在你的情况下,打印项目,以便:

for item in lstOnCall:   
    print item 

你的代码的其他问题
有不是Python中的定义Function overloading。你可以定义多功能同名在python中。但它没有任何意义。只有最后的定义仍然在您的class/module。以前的定义将覆盖将覆盖。你所用

class User: 
    def __init__(self, a, b, c): 
     ... 
    def __init__(self): 
     pass 

做的是。它适用于JavaC#但不在Python。功能def __init__(self, a, b, c)将被覆盖。只有功能def __init__(self)存在于你的班级中。

+0

有没有办法打印所有的物品而不用打电话?即时获取打印项目() TypeError:'用户'对象不可调用 – AlexW

+0

是的。我会添加它 – qvpham

+0

所以我已经添加了功能打印所有项目 – qvpham

1

试试这个,

class User: 
    def __init__(self,*args,**kargs): 
     if len(kargs)==0 : ''' No param passed ''' 
      self.Policy = 'Some' 
      self.Level = 0 
     else: 
      self.Policy = kargs['Policy'] 
      self.Level = kargs['Level'] 
      [..] 

user= User() 
user1= User(Policy='Some',Level=13) 
+0

谢谢,我该如何打印课程中的所有项目以供查看?我尝试了lstOnCall中的项目: 打印项目,但我得到<__ main __。用户实例在0x7f75c02f97a0> – AlexW

+0

@AlexW我更新了代码。前一个不是正确的做法。这个在我的环境中工作正常。 – Kajal

1

您可以设置所有参数__init__的是None默认为:

def __init__(self, Policy=None, Level=None, etc...): 
1

转换你的构造方法的位置参数来命名的,可选的参数有一个有用的默认值:

class User: 
    def __init__(self, Policy=Null, Level=1, 
       StartDate="2016-01-01", EndDate="2016-12-31", 
       StartTime="00:00", EndTime="23:59", 
       Name="UNKNOWN", Mobile=""): 
     self.Policy = Policy 
     self.Level = Level 
     self.StartDate = StartDate 
     self.EndDate = EndDate 
     self.StartTime = StartTime 
     self.EndTime = EndTime 
     self.Name = Name 
     self.Mobile = Mobile