2016-12-25 7 views
-1

Ich erstelle eine Klasse namens Conversation als Teil eines größeren Codes und möchte sicherstellen, dass die Felder, in die der Benutzer eingibt, gültig sind (für den Fall, dass sie ungültig sind, möchte ich einen Wert erhöhen) Fehler), aber meine is_valid Methode funktioniert nicht, wenn ich das Programm ausführen:Validierungsmethode innerhalb einer Klasse

Klasse Gespräch:

def __init__(self, members, size_limit, backup_policy, cloud_account_prefix='./'): 
    if not self.is_valid(): 
     raise ValueError 
    self.members = members 
    self.size_limit = size_limit 
    self.backup_policy = backup_policy 
    self.cloud_account_prefix = cloud_account_prefix 
    self.backup_count = 0 
    self.size_count = 0 
    self.messages = [] 

def is_valid(self, members, size_limit, backup_policy, cloud_account_prefix): 
    if self.members < 2: 
     return False 
    if self.size_limit <= 10: 
     return False 
    if not path_ok(self.cloud_account_prefix): 
     return False 
    if self.backup_policy < 1: 
     return False 
    else: 
     return True 

Was mache ich falsch?

+3

Funktioniert nicht? Irgendein Fehler? Rufst du es irgendwo an? – Miguel

+0

entfernen Sie "selbst." in deiner is_valid-Funktion. In diesem Moment sind noch nicht definiert. Verwenden Sie stattdessen direkt die Argumente. zB: "if members <2:" –

+0

Warum validieren Sie Ihre Attribute bei der Zuweisung nicht mithilfe von Eigenschaften? Auch solltest du besseres Feedback geben; warum nicht die Validierung den Fehler werfen, der eigentlich sagt * welchen Wert und warum *? "Es gab einen ValueError" sagt mir nichts, aber z.B. "Sie müssen mindestens zwei Mitglieder angeben" ist nützliche Information. – jonrsharpe

Antwort

2
  1. Sie rufen is_valid bevor eine Initialisierung so jeden Anruf zu self.something erfolgt im Inneren mit AttribueError führen.

  2. is_valid erwartet 4 Argumente noch Sie nennen es mit 0.

sollte Ihr Code

class Conversation: 
    def __init__(self, members, size_limit, backup_policy, cloud_account_prefix='./'): 

     self.members = members 
     self.size_limit = size_limit 
     self.backup_policy = backup_policy 
     self.cloud_account_prefix = cloud_account_prefix 
     self.backup_count = 0 
     self.size_count = 0 
     self.messages = [] 
     if not self.is_valid(): 
      raise ValueError 

    def is_valid(self): 
     if self.members < 2: 
      return False 
     if self.size_limit <= 10: 
      return False 
     if not path_ok(self.cloud_account_prefix): 
      return False 
     if self.backup_policy < 1: 
      return False 
     else: 
      return True 

Ein weiterer Ansatz könnte sein, alle __init__-is_valid die Argumente zu übergeben sie überprüfen sind gültig, bevor Sie sich bemühen, die Instanzattribute zu initialisieren:

class Conversation: 
    def __init__(self, members, size_limit, backup_policy, cloud_account_prefix='./'): 
     if not self.is_valid(members, size_limit, backup_policy, cloud_account_prefix): 
      raise ValueError 
     self.members = members 
     self.size_limit = size_limit 
     self.backup_policy = backup_policy 
     self.cloud_account_prefix = cloud_account_prefix 
     self.backup_count = 0 
     self.size_count = 0 
     self.messages = [] 

    def is_valid(self, members, size_limit, backup_policy, cloud_account_prefix): 
     if members < 2: 
      return False 
     if size_limit <= 10: 
      return False 
     if not path_ok(cloud_account_prefix): 
      return False 
     if backup_policy < 1: 
      return False 
     else: 
      return True 
Verwandte Themen