python模拟重载初始化函数的方法详解

 更新时间:2024年11月15日 09:17:37   作者:仙草哥哥  
重载初始化函数,是指同一个类中定义了多个构造函数,可以通过多种不同的方法进行构造,下面我们就来看看在python中如何实现类似的功能吧

重载初始化函数

重载初始化函数,是指同一个类中定义了多个构造函数,可以通过多种不同的方法进行构造。

举例来说,如果我们创建了一个学生类,在创建学生的时候,需要提供学生的姓名以及出生日期,对于出生日期,我们考虑可以使用date对象,直接进行初始化。也可以分别使用年,月,日进行初始化。或者还可以使用例如2024-11-14日这样的时间字符串进行初始化。

在python中并没有直接的函数重载,但是,我们有多种方法可以实现类似的功能。

python实现

根据对象类型

这种方法根据传入的参数的类型不同,从而实现通过不同的方法进行解析。但是缺点是在类型多的情况下,代码变得非常复杂。

from datetime import date
 
class Student:
    def __init__(self, name, birth_date):
        if isinstance(birth_date, date):
            self.birth_date = birth_date
        elif isinstance(birth_date, str):
            try:
                year, month, day = map(int, birth_date.split("-"))
                self.birth_date = date(year, month, day)
            except ValueError:
                raise ValueError("日期字符串格式应为YYYY-MM-DD")
        elif isinstance(birth_date, tuple) and len(birth_date) == 3:
            year, month, day = birth_date
            self.birth_date = date(year, month, day)
        else:
            raise TypeError("birth_date必须是date对象,YYYY-MM-DD格式的字符串,或(年, 月, 日)的元组")
 
        self.name = name
 
    def __str__(self):
        return f"Student(name={self.name}, birth_date={self.birth_date})"
 
 
student1 = Student("sagegrass", date(2011, 11, 11))
student2 = Student("sagegrass", "2011-11-11")
student3 = Student("sagegrass", (2011, 11, 11))
 
print(student1)
print(student2)
print(student3)

使用类方法

通常情况下,使用类方法被认为是最好的实践方法,唯一的缺点在于,与常规的初始化略有不同,因此一些用户可能不能适应。

from datetime import date
 
class Student:
    def __init__(self, name, birth_date):
        if not isinstance(birth_date, date):
            raise TypeError("birth_date必须是datetime.date类型")
        self.name = name
        self.birth_date = birth_date
        
    @classmethod
    def from_string(cls, name, birth_date_str):
        try:
            year, month, day = map(int, birth_date_str.split("-"))
            birth_date = date(year, month, day)
            return cls(name, birth_date)
        except ValueError:
            raise ValueError("日期字符串格式应为YYYY-MM-DD")
 
    @classmethod
    def from_year_month_day(cls, name, year, month, day):
        try:
            birth_date = date(year, month, day)
            return cls(name, birth_date)
        except ValueError:
            raise ValueError("日期无效,请使用正确的年月日")
 
    def __str__(self):
        return f"Student(name={self.name}, birth_date={self.birth_date})"
 
 
student1 = Student("sagegrass", date(2011, 11, 11))
student2 = Student.from_string("sagegrass", "2011-11-11")           
student3 = Student.from_year_month_day("sagegrass", 2011, 11, 11)   
 
print(student1)
print(student2)
print(student3)

使用静态方法

如果将之前使用的类方法,改为静态方法,也是可行的,这样无需再访问类本身。

from datetime import date
 
class Student:
    
    def __init__(self, name, birth_date):
        if not isinstance(birth_date, date):
            raise TypeError("birth_date必须是datetime.date类型")
        self.name = name
        self.birth_date = birth_date
    
    @staticmethod
    def from_year_month_day(name, year, month, day):
        try:
            birth_date = date(year, month, day)
            return Student(name, birth_date)
        except ValueError:
            raise ValueError("日期无效,请使用正确的年月日")
 
    def __str__(self):
        return f"Student(name={self.name}, birth_date={self.birth_date})"
       
        
student = Student.from_year_month_day("sagegrass", 2011, 11, 11)   
 
print(student)

但是需要注意的是,通常情况下,应该优先使用类方法而非静态方法。因为在包含继承关系的情况下,类方法可以总是保证返回的是子类的实例。而静态方法则会返回父类的实例,从而出现不符合预期的情况。

使用带默认值的参数

当提供了大量的默认值参数,初始化函数会变得复杂和难以理解,缺点与根据对象类型初始化相似。

from datetime import date
 
class Student:
    
    def __init__(self, name, birth_date=None, year=None, month=None, day=None):
        if birth_date is not None:
            if not isinstance(birth_date, date):
                raise TypeError("birth_date必须是datetime.date类型")
            self.birth_date = birth_date
        elif all([year, month, day]):
            try:
                self.birth_date = date(year, month, day)
            except ValueError:
                raise ValueError("日期无效,请使用正确的年月日")
        else:
            raise ValueError("必须提供birth_date或者年月日的组合")
 
        self.name = name
 
    def __str__(self):
        return f"Student(name={self.name}, birth_date={self.birth_date})"
        
 
student1 = Student("sagegrass", birth_date=date(2011, 11, 11))  
student2 = Student("sagegrass", year=2011, month=11, day=11)    
 
print(student1)
print(student2)

并且,使用该方法通常无法同时满足使用位置参数进行传入,因此也可以考虑禁止使用位置参数。

# 禁用位置参数
def __init__(self, name, *, birth_date=None, year=None, month=None, day=None):
    pass
 
# 或者允许birth_date使用位置参数,但不允许年月日用
def __init__(self, name, birth_date=None, *, year=None, month=None, day=None):
    pass

到此这篇关于python模拟重载初始化函数的方法详解的文章就介绍到这了,更多相关python重载初始化函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现不同样式二维码

    Python实现不同样式二维码

    作为一名合格的 Python 程序员,在工作中必然会用到二维码相关操作,那如何快速的用 Python 实现呢?别着急,咱们这篇博客就为你解决
    2023-01-01
  • Pycharm学生免费专业版安装教程的方法步骤

    Pycharm学生免费专业版安装教程的方法步骤

    这篇文章主要介绍了Pycharm学生免费专业版安装教程的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 利用Python实现在同一网络中的本地文件共享方法

    利用Python实现在同一网络中的本地文件共享方法

    今天小编就为大家分享一篇利用Python实现在同一网络中的本地文件共享方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • pow在python中的含义及用法

    pow在python中的含义及用法

    在本篇文章里小编给各位分享了关于pow在python中是什么意思的相关知识点内容,有需要的朋友们参考学习下。
    2019-07-07
  • python用来获得图片exif信息的库实例分析

    python用来获得图片exif信息的库实例分析

    这篇文章主要介绍了python用来获得图片exif信息的库,实例分析了exif-py库文件的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • python空值填充为无的实现方法

    python空值填充为无的实现方法

    我们经常会遇到数据集中存在空值的情况,本文主要介绍了python空值填充为无的实现方法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 基于Python制作简易的windows修改器

    基于Python制作简易的windows修改器

    现在应该大部分人都使用win11系统吧,win11其实挺好用哈,只是有一点不好用,就是右键的菜单,今天做个小程序,就是应该修改win11的一个应用程序,感兴趣的可以了解一下
    2022-08-08
  • pytorch中的dataset用法详解

    pytorch中的dataset用法详解

    这篇文章主要介绍了pytorch的dataset用法详解,当我们继承了一个 Dataset类之后,我们需要重写 len 方法,该方法提供了dataset的大小; getitem 方法, 该方法支持从 0 到 len(self)的索引,下面来看看附有代码的讲解吧,希望对你的学习或者工作有所帮助
    2022-01-01
  • 解决numpy矩阵相减出现的负值自动转正值的问题

    解决numpy矩阵相减出现的负值自动转正值的问题

    这篇文章主要介绍了解决numpy矩阵相减出现的负值自动转正值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python列表如何更新值

    Python列表如何更新值

    在本篇内容中小编给大家整理的是一篇关于Python列表如何更新值的知识点,需要的朋友们可以学习下。
    2020-05-05

最新评论