gpt4 book ai didi

python - 在python中复制构造函数

转载 作者:行者123 更新时间:2023-11-28 20:33:38 29 4
gpt4 key购买 nike

我想知道是否可以像在 java 中那样在 python 中执行复制构造函数,这是我的 java 代码、常规承包商和复制构造函数。下面的代码如何用 python 编写?谢谢

public Date(int day, int month, int year)
{
_day = day;
_month = month;
_year = year;

if(!checkDate(_day,_month,_year))
{
_day = DEFAULT_DAY;
_month = DEFAULT_DAY;
_year = DEFAULT_YEAR;
}
}

/**
* Copy constructor.
*/
public Date (Date other)
{
if(other != null)
{
_day = other._day;
_month = other._month;
_year = other._year;
}
}

最佳答案

Python 中没有重载,所以你不能“重载构造函数”,原因很简单,你不能重载任何东西

Python中“模拟重载”一般有两种方式,都适用于重载的构造函数:1

  • 编写一个足够灵活的方法来接受任何一组参数。
  • 写两个不同名称的方法。

第一个很简单:

def __init__(self, date_or_day, month=None, year=None):
if isinstance(date_or_day, Date):
# do "copy" stuff
else:
# do "non-copy" stuff

……或者,一个小的变化:

def __init__(self, day=None, month=None, year=None, *, date=None):
if month is None:
# do "copy" stuff
else:
# do "non-copy" stuff

这可行,但可能有点笨拙。 (想一想 range 的接口(interface),即使知道了也很难清楚地写下来。)无论哪种方式,您可能都想对 raise TypeError( "some message") 如果用户做了一些无意义的事情,比如用日期和月份调用它。

如果您更喜欢要求关键字参数:

def __init__(self, day=None, month=None, year=None, *, date=None):
if date is not None:
# do "copy" stuff, maybe also assert that month and year are None
else:
# do "non-copy" stuff

… 那么构造函数就不能再被调用为 Date(otherdate) 了,但它可以被调用为 Date(date=otherdate),这可能是无论如何都更清晰,并且您可以避免第一个参数可能具有两种不同含义的所有繁琐内容。


第二个乍一看似乎不可能,因为构造函数必须以 Date(...) 的形式调用。

但是您可以使用“替代构造函数”惯用语,通过定义一个可以显式调用为 Date.from_somethingelse(…) 的类方法。事实上,这个习语在标准库的 datetime 库的类型中被大量使用——例如,datetime.datetime.now() 是一个替代构造函数,它创建一个 datetime 表示现在的对象。

所以,例如:

def __init__(self, date=None):
if date is None:
# do "default constructor" stuff
else:
# do "copy" stuff

@classmethod
def from_dmy(cls, day, month, year):
self = cls()
# do "non-copy" stuff

最后一点:复制构造函数在惯用的 Python 中很少见,因为它们确实不如 Java 等语言有用。

首先,它们无处可隐式应用——赋值不是副本,即使是,变量没有类型,值有,所以没有“钩子(Hook)”供您指定你想要什么构造函数。如果你想明确地复制一些东西,你通常要么添加一个 copy 方法( as with list and dict ),要么只使用 copy module .

比较常见的是一个构造函数,它采用更广泛的内容,包括您自己的类型。例如,列表可以从任何可迭代对象构造,包括另一个列表,字典可以从任何可迭代对象或任何映射构造,包括另一个字典。


<子>1。实际上,在 Python 中,__init__ 方法不是构造函数,而是初始化器——它们不返回对象,而是在已构造的对象上调用并初始化它。如果您确实需要编写构造函数(通常用于不可变对象(immutable对象),创建后无法初始化),那就是 __new__

关于python - 在python中复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50182648/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com