работа с атрибутами и методами экземпляра

#python

#python

Вопрос:

Как мне адаптировать checkLength() метод для принятия любых атрибутов экземпляра, которые я передаю ему? Например, в этом контексте я могу проверить либо первый, либо последний, без жесткого кодирования внутри метода checkLength()?

Любая помощь будет очень признательна.

 class Name:
  def __init__(self, f, l):
    self.first = f
    self.last = l

  def checkLength(self):
    if type(self.first) == str:
      return len(self.first)
    else:
      return False

myName = Name('Sir', 'Mixalot') 
print(myName.checkLength())
 

Я пробовал следующие комбинации:

   def checkLength(self, last):
    if type(self.last) == str:
      return len(self.last)
    else:
      return False

print(myName.checkLength(last))
 
   def checkLength(self.last):
    if type(self.last) == str:
      return len(self.last)
    else:
      return False

print(myBody.checkLength(self.last))
 

Обновление — попытка использовать getattr

   def __init__(self, f, l):
    self.first = f
    self.last = l

  def checkLength(self, attr):
    if type(getattr(self, attr)) == str:
      return len(getattr(self, attr))
    else:
      return False

myName = Name('Sir', 'Mixalot') 
print(myName.checkLength(self, "last"))
 

ошибка =

 NameError: name 'self' is not defined````
 

Комментарии:

1. Не могли бы вы уточнить, чего именно вы хотите достичь с помощью функции checkLength ? Каково желаемое использование этой функции?

2. Почему бы вам просто не использовать эту len функцию напрямую? Например: print(len(myName.last)) Или, если вам нужна версия len , которая сначала проверяет тип, вы можете написать эту функцию ( typeSafeLen ) независимо от вашего класса.

3. Ваш вопрос не совсем ясен. В соответствии с чем вы собираетесь выбирать между проверкой len f или l ?

4. Примечание: для проверки типов вы хотите либо if isinstance(self.first, str): (разрешить подклассы), либо if type(self.first) is str: (строгий тест для этого точного класса). Не используйте == str ; str класс является одноэлементным, и если вы хотите строгой проверки, используйте is для проверки подлинности, а не == (для проверки равенства значений).

5. Это должно быть print(myName.checkLength("last"))

Ответ №1:

Рассмотрите возможность использования getattr(object, name[, default]) . Например:

 class Name:
  def __init__(self, f, l):
    self.first = f
    self.last = l

  def checkLength(self, attr):
    if type(getattr(self, attr)) == str:
      return len(getattr(self, attr))
    else:
      return False

myName = Name('Sir', 'Mixalot') 
print(myName.checkLength("first"))
 

3

Но вы также должны добавить некоторую обработку ошибок, когда этот атрибут отсутствует.

Комментарии:

1. спасибо за ваш любезный ответ, я не знаком с getattr, ваше предложение очень полезно. Я обновил свой код в исходном сообщении. Я все еще борюсь с этим решением, так как получаю сообщение об ошибке print(myBody.checkLength(self, last)). NameError: name 'self' is not defined

2. @dimButTries Я думаю, вы забыли поместить все это в класс.