访问实例变量AttributeError

时间:2018-07-05 16:47:38

标签: python pycharm instance instance-variables

我有一些有关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对象”:

AttributeError:'str'对象没有属性'pay'

emp_1不是Employee的实例吗?

最后一个问题,(这可能只是一个PyCharm问题)PyCharm不会警告我该代码在我尝试运行之前会被破坏,为什么?

1 个答案:

答案 0 :(得分:3)

在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()是对Method的调用,并且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