我了解都__init__和__new__工作.我想知道是否有什么__init__可以做到的__new__不可以?
即可以使用__init__以下模式替换:
class MySubclass(object):
def __new__(cls, *args, **kwargs):
self = super(MySubclass, cls).__new__(cls, *args, **kwargs)
// Do __init__ stuff here
return self
Run Code Online (Sandbox Code Playgroud)
我问,因为我想让Python OO的这个方面更适合我.
这里有一些代码来演示我在说什么.
class Foo(tuple):
def __init__(self, initialValue=(0,0)):
super(tuple, self).__init__(initialValue)
print Foo()
print Foo((0, 0))
Run Code Online (Sandbox Code Playgroud)
我希望两个表达式产生完全相同的结果,但该程序的输出是:
()
(0, 0)
Run Code Online (Sandbox Code Playgroud)
我在这里不理解什么?
我有一个pandas.DatetimeIndex间隔['2018-01-01', '2018-01-04')(开始包括,结束排除)和freq=1D:
>>> index = pd.DatetimeIndex(start='2018-01-01',
end='2018-01-04',
freq='1D',
closed='left')
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03'],
dtype='datetime64[ns]',
freq='D')
Run Code Online (Sandbox Code Playgroud)
如何end='2018-01-04'再次获取正确的打开属性?我需要它用于具有时间戳范围的数据库查询.
index.endindex[-1] 回报 '2018-01-03'index[-1] + index.freq 在这种情况下工作但是错了 freq='2D'我想扩展datetime.date类,为它添加一个名为的属性status,表示日期是工作日,行政非工作日,法院关闭日,......
我已经阅读过如何在python中扩展一个类?,如何在python中扩展Python类init和链调用父构造函数,但我不太了解它,所以我是OOP的noob.
>>> import datetime
>>> class Fecha(datetime.date):
def __init__(self, year, month, day, status):
super(Fecha, self).__init__(self, year, month, day)
self.status = status
>>> dia = Fecha(2014, 7, 14, 'laborable')
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
dia = Fecha(2014, 7, 14, 'laborable')
TypeError: function takes at most 3 arguments (4 given)
>>>
Run Code Online (Sandbox Code Playgroud) 这个问题与this,this,this和this有关,但不是重复的。这些链接在这里没有回答我的问题。但是,这几乎可以回答我的问题,但不能回答,因为答案中的代码无法在Python 3.6中运行,而且无论如何该问题都不是我在这里问的具体问题。(请参阅下面的我自己的答案。
从Python的文档页面,我发现下面的文字。
__new__()主要用于允许不可变类型的子类(例如int,str或tuple)自定义实例创建。为了自定义类的创建,它通常也被自定义元类覆盖。
但是为什么呢?为什么我们不能仅覆盖__init__()而不是必须覆盖__new__()?显然,frozenset例如,甚至没有实现__init__();为什么呢?我从了解这里,在某些罕见的情况下,__new__()并且__init__()需要做不同的事情,但据我可以看到,封装状态中只有。是什么样的不可变的类型,特别需要使用的__new__(),而不是__init__()?
python ×5
constructor ×2
inheritance ×2
python-3.x ×2
class ×1
datetime ×1
oop ×1
pandas ×1
subclass ×1
tuples ×1