Доступ к переменным экземпляра, AttributeError - PullRequest
0 голосов
/ 05 июля 2018

У меня есть несколько связанных вопросов о переменных экземпляра в Python. Я поставлю первый (основной) вопрос в комментарии внутри самого кода, а затем задам соответствующие вопросы:

class Employee:

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'
        self.pay = pay

    def fullname(self):
        return '{} {}'.format(self.first, self.last)

    @classmethod
    def from_string(cls, emp_str):
        first, last, pay = emp_str.split(',')
        return cls(first, last, pay)

emp_str_1 = 'John,Doe,70000'

emp_1 = Employee.from_string(emp_str_1)

print(emp_1.fullname(), emp_1.pay, emp_1.email) #<--- This works

print(emp_1.fullname().pay.email) #<--- Why can't I do this??

Кроме того, почему сообщение об ошибке называется "str object":

AttributeError: у объекта 'str' нет атрибута 'pay'

Разве emp_1 не является экземпляром Employee?

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

1 Ответ

0 голосов
/ 05 июля 2018

В Python конкатенация может быть выполнена с помощью +

print(emp_1.fullname(), emp_1.pay, emp_1.email) # THIS WILL WORK,

потому что вы просто передаете строки. [НЕ ОТНОШЕНО к этому вопросу, просто дополнительная информация: в случае, если вы печатаете целые числа или логическое значение, то произойдет сбой, если вы явно не введете его с помощью str ())

print(emp_1.fullname().pay.email) # THIS IS NOT WORKING,

потому что '.' Оператор используется для доступа к методам и переменным экземпляра.

Если вы используете emp_1.fullname (), он вызывает метод fullname (), который возвращает некоторую строку.

Но если вы используете emp_1.fullname (). Pay - emp_1.fullname () - это вызов метода, а метод fullname () не имеет никаких переменных, таких как «pay». Поэтому правильный способ использования - emp_1.pay.

Я бы предложил использовать печатную форму, как,

print("Name :{}:, Pay :{}: , Mail :{}:".format(emp_1.fullname(), emp_1.pay, emp_1.email)) # BECAUSE format will typecast in case if your pay is INTEGER OR FLOAT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...