#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 Я думаю, вы забыли поместить все это в класс.