我有一些有关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不会警告我该代码在我尝试运行之前会被破坏,为什么?
答案 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