【问题标题】:How do I create an alternative constructor using a class method?如何使用类方法创建替代构造函数?
【发布时间】:2022-01-25 12:55:05
【问题描述】:

以下代码应从员工字符串生成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)

【问题讨论】:

  • 究竟是什么问题?
  • 使用 self.first , self.last , self.pay = emp_str.split('-') 并使用 int(self.pay) 更新 self.pay 数据类型

标签: python class class-method


【解决方案1】:

你的emp_str 不能有 self 参数(因为它还没有对象的实例),但它应该返回一个使用常规 init 生成的新实例:

def emp_str(emp_str):
    first , last , pay = emp_str.split('-')
    return Employee(first,last,float(pay))

这不是类方法,所以当它用于Employee的任何子类时,它将返回一个Employee实例而不是子类的实例。

【讨论】:

    【解决方案2】:

    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)
    

    确保它在课堂之外。

    【讨论】:

    • 感谢您的帮助。如果我不想使用 classmethod ,或者写这个程序没有@classmethod,这个程序怎么写?
    【解决方案3】:

    我不太确定你想要什么,但在我看来你希望你的 emp_str 成为你的示例和标签的替代构造函数。

    为此,我们使用 classmethod 装饰器并相应地构建方法

    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
    >>> 
    

    【讨论】:

      【解决方案4】:

      试试这个:

      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)
      

      【讨论】:

        【解决方案5】:

        您希望emp_str 返回 na emp2,但它什么也不返回。添加: return Employee(first, last, pay)

        另一个问题,你在类上调用emp_str,所以它应该是一个静态方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-03
          • 2019-04-19
          相关资源
          最近更新 更多