以下代码应该从employee字符串生成一个Employee
实例,但似乎不起作用。实例未创建。我该如何让它发挥作用?
class Employee:
def __init__(self,first,last,pay):
self.first=first
self.last=last
self.pay=pay
def pay_increase(self):
self.pay += (self.pay * 0.1)
def emp_str(self,emp_str):
first , last , pay = emp_str.split('-')
emp1=Employee('reza','azaf',2000)
emp1.pay_increase()
emp2_str= 'rezd-454-454'
emp2 = Employee.emp_str(emp2_str)
print(emp2.first)
emp_str
需要是classmethod
,并返回新创建的类,如下所示:
@classmethod
def emp_str(cls,emp_str):
first , last , pay = emp_str.split('-')
return cls(first,last,pay)
根据您的请求,没有类方法:
def emp_str(emp_str):
first , last , pay = emp_str.split('-')
return Employee(first, last, pay)
确保它在课堂之外。
您期望emp_str
返回na-emp2,但它什么也不返回。添加:return Employee(first, last, pay)
另一个问题是,在类上调用emp_str
,所以它应该是一个静态方法。
试试这个:
class Employee:
def __init__(self, first=None, last=None, pay=None):
self.first = first
self.last = last
self.pay = pay
def pay_increase(self):
self.pay += (self.pay * 0.1)
def emp_str(self,emp_str):
first, last, pay = emp_str.split('-')
self.first = first
emp1 = Employee(first='reza',last='azaf',pay=2000)
emp1.pay_increase()
emp2_str = 'rezd-454-454'
emp2 = Employee()
emp2.emp_str(emp2_str)
print(emp2.first)
我不太确定你想要什么,但在我看来,鉴于你的示例和标签,你希望你的emp_str
是一个替代构造函数。
为此,我们使用classmethoddecorator并相应地构建方法
class Employee:
def __init__(self,first,last,pay):
self.first=first
self.last=last
self.pay=pay
def pay_increase(self):
self.pay += (self.pay * 0.1)
@classmethod
def emp_str(cls,emp_str):
first , last , pay = emp_str.split('-')
return cls(first , last , int(pay))
def __str__(self):#lets also add a way to nicely print this object
return f"{type(self).__name__}({self.first!r}, {self.last!r}, {self.pay!r})"
现在快速测试
>>> emp1=Employee('reza','azaf',2000)
>>> print(emp1)
Employee('reza', 'azaf', 2000)
>>> emp1.pay_increase()
>>> print(emp1)
Employee('reza', 'azaf', 2200.0)
>>> emp2_str= 'rezd-454-454'
>>> emp2 = Employee.emp_str(emp2_str)
>>> print(emp2)
Employee('rezd', '454', 454)
>>> print(emp2.first)
rezd
>>>
您的emp_str
不能有自参数(因为它还没有对象的实例(,但它应该返回一个用常规init:生成的新实例
def emp_str(emp_str):
first , last , pay = emp_str.split('-')
return Employee(first,last,float(pay))
这不是一个类方法,所以当它用于Employee的任何子类时,它将返回一个Employees实例,而不是该子类的实例。