2016-12-25 4 views
-1

Я создаю класс под названием «Беседа» как часть более крупного кода и хочу убедиться, что введенные пользователем поля действительны (в случае, если они недействительны, я хочу поднять значение Ошибка), но мой is_valid метод не работает, когда я запускаю программу:метод проверки в классе

класса Диалог:

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 

Что я делаю неправильно?

+3

Не работает? Любая ошибка? Вы называете это где-то? – Miguel

+0

удалить 'self.' в вашей функции is_valid. На данный момент еще не определены. Вместо этого используйте аргументы. например: «если члены <2:» –

+0

Почему вы не проверяете свои атрибуты при присваивании с использованием свойств? Также вы должны дать лучшую обратную связь; почему бы не сделать валидацию выбросить ошибку, которая на самом деле говорит *, какую ценность и почему *? «Был ValueError» ничего мне не говорит, но, к примеру, «вы должны указать не менее двух членов» - полезная информация. – jonrsharpe

ответ

2
  1. Вы звоните is_valid до того, как инициализация делается для того, чтобы любой вызов self.something внутри это приведет с AttribueError.

  2. is_valid ожидает 4 аргумента пока вы вызываете его с 0.

Ваш код должен быть

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 

Другой подход мог бы передать все аргументы __init__ к is_valid, чтобы проверить, что они действительны до начала инициализации атрибутов экземпляра:

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