2016-04-28 23 views
0

Ich habe eine neue Klasse erstellt und ich versuche, dynamisch zu dieser Klasse hinzuzufügen, Ich habe eine Liste erstellt, die ich mehrere Objekte einfügen möchte, dann werde ich darüber iterieren Liste in Django (ist dies der richtige Weg, Dinge zu tun?)Hinzufügen zu einer Klasse dynamisch

aber ich bin die folgenden Fehler

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

ich weiß immer, was der Fehler bedeutet, ich bin nur gefragt, wie ich mich über die Schaffung eine neue Instanz meiner Objekte und fügen Sie es auf der Flucht leicht hinzu?

### 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: Hinzufügen der unten funktioniert, ich muss nur wissen, wie jetzt die Einzelteile drucken?

def __init__(self): 
     pass 

die unter

for item in lstOnCall:   
    print item() 

kehrt

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

Es ist 'print item' in Python 2 und' print (item) 'in Python 3. Nicht sicher, was die Absicht der Klammern nach' item' ist. – BallpointBen

+0

Ich bin mir nicht sicher, was du machen willst. Außerdem benötigen Sie zwei Eingänge nicht. Wenn Ihre Klasse Parameter annimmt, sollten Sie tun, wie James es vorgeschlagen hat. –

+0

Ich bin mir nicht sicher, warum Sie sie nicht in der Instantiierung übergeben. Sie haben die Daten genau dort; Warum also nicht 'objUser = Benutzer (strPolicyName, objOnCall ['level'], getDate (objOnCall ['start']))? –

Antwort

3

Sie können ein dynamisches Konstruktor schreiben() für die Klasse so:

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]) 
  • Die Variable __attrs speichert die Variablennamen. Ich habe eine doppelte Unterstreichungsvariable verwendet, so dass sie von extend nicht erreichbar ist.
user = User() 
print(user.__attrs) 
Traceback (most recent call last): 
    print(user.__attrs) 
AttributeError: 'User' object has no attribute '__attrs' 

Ja, es gibt eine andere Methode Doppelstrich Variable zuzugreifen, aber niemand wird das tun;)

  • Die Funktion __repr__ die string Rückkehr von print oder str Aufruf , wenn die Funktion __str__ nicht existiert.

Jetzt testen

>>> 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 

Wenn Sie meine Codes verwenden, können Sie die Einzelteile in Ihrem Fall drucken, so:

for item in lstOnCall:   
    print item 

Andere Problem des Codes
Es sind nicht die Definition in Python. Sie können mehrere Funktionen mit dem gleichen Namen in Python definieren. Aber es ergibt keinen Sinn. Nur die letzte Definition bleibt in Ihrem class/module. Die vorherigen Definitionen sind überschrieben. Was machst du mit

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

ist Falsch. Es funktioniert in Java oder C# aber nicht in Python. Die Funktion def __init__(self, a, b, c) wird überschrieben. In Ihrer Klasse existiert nur die Funktion def __init__(self).

+0

gibt es eine Möglichkeit, alle Artikel ohne Aufruf zu drucken? Ich bekomme Print Item() TypeError: 'Benutzer' Objekt ist nicht aufrufbar – AlexW

+0

Ja. Ich werde es hinzufügen – qvpham

+0

So habe ich die Funktion hinzugefügt, um alle Artikel – qvpham

1

die Sie interessieren,

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

Danke, wie drucke ich alle Elemente in der Klasse für die Anzeige jetzt? Ich versuchte für Artikel in lstOnCall: Drucken Artikel, aber ich bekomme <__ Haupt __. Benutzerinstanz bei 0x7f75c02f97a0> – AlexW

+0

@AlexW Ich aktualisierte den Code. Vorheriges war nicht der richtige Weg. Dieser funktioniert in meiner Umgebung gut. – Kajal

1

Sie alle Parameter auf __init__ einstellen könnte None standardmäßig sein:

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

Konvertieren Sie die Positionsparameter des Konstruktor-Methode genannt, optionale Parameter mit einem nützlichen Standardwert:

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 
Verwandte Themen