如何使用类方法创建替代构造函数



以下代码应该从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实例,而不是该子类的实例。

相关内容

最新更新