相关疑难解决方法(0)

Python:总是使用__new__而不是__init__?

我了解都__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的这个方面更适合我.

python new-style-class

27
推荐指数
2
解决办法
4540
查看次数

Python忽略了在继承类中提供给元组的参数的默认值

这里有一些代码来演示我在说什么.

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)

我在这里不理解什么?

python inheritance constructor tuples

5
推荐指数
1
解决办法
99
查看次数

可以pandas.DatetimeIndex记住是否关闭?

我有一个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'再次获取正确的打开属性?我需要它用于具有时间戳范围的数据库查询.

  1. 没有 index.end
  2. index[-1] 回报 '2018-01-03'
  3. index[-1] + index.freq 在这种情况下工作但是错了 freq='2D'

python datetime pandas

5
推荐指数
1
解决办法
155
查看次数

在Python 3中扩展一个类并使用__init__构造它

我想扩展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)

python oop inheritance class python-3.x

2
推荐指数
1
解决办法
973
查看次数

为什么Python不可变类型(例如int,str或tuple)需要使用__new __()而不是__init __()?

这个问题与thisthisthisthis有关,但不是重复的。这些链接在这里没有回答我的问题。但是几乎可以回答我的问题,但不能回答,因为答案中的代码无法在Python 3.6中运行,而且无论如何该问题都不是我在这里问的具体问题。(请参阅下面的我自己的答案。

Python的文档页面,我发现下面的文字。

__new__()主要用于允许不可变类型的子类(例如int,str或tuple)自定义实例创建。为了自定义类的创建,它通常也被自定义元类覆盖。

但是为什么呢?为什么我们不能仅覆盖__init__()而不是必须覆盖__new__()?显然,frozenset例如,甚至没有实现__init__()为什么呢?我从了解这里,在某些罕见的情况下,__new__()并且__init__()需要做不同的事情,但据我可以看到,封装状态中只有。是什么样的不可变的类型,特别需要使用的__new__(),而不是__init__()

python constructor subclass python-3.x

2
推荐指数
1
解决办法
298
查看次数