2016-04-28 95 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