2016-04-28 22 views
0

新しいクラスを作成しましたが、そのクラスに動的に追加しようとしています リストを作成しました。複数のオブジェクトを入れたいので、それを繰り返しますジャンゴ内のリスト(これは物事の正しい方法は何ですか?)クラスに動的に追加する

が、私はエラーが何を意味するか知っている以下のエラー

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: 以下の作品を追加し、私はちょうど今のアイテムを印刷する方法を知っておく必要がありますか?:

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

あなたは何をしたいのか分かりません。また、あなたは2つの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' 

はい、そこに二重のアンダースコア変数にアクセスするための他の方法がありますが、誰もそれを行いません。)

  • 機能はprintまたはstrを呼び出すことによってstringを返す__repr__関数__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ではありません。 と同じ名前をと定義することができます。しかし、それは意味をなさない。 の最後のの定義は、class/moduleに残ります。以前の定義は、が上書きされたになります。あなたが

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

でやっていることはです。 JavaまたはC#で動作しますが、のPythonでは動作しません。関数def __init__(self, a, b, c)は上書きされます。あなたのクラスにはdef __init__(self)の関数しか存在しません。

+0

これを呼び出さずにすべてのアイテムを印刷する方法はありますか?印刷アイテムを取得しています TypeError: 'User'オブジェクトは呼び出し可能ではありません – AlexW

+0

はい。私はそれを追加します – qvpham

+0

私はすべての項目を印刷する関数を追加しました – qvpham

1

あなたは、デフォルトでNoneする__init__にすべてのパラメータを設定することができ

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

、これを試してみてください以下

def __init__(self): 
     pass 
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