Почему я не могу разделить datetime.date на подклассы?

Ruby поставляется с классом Gem, который знает о версиях:

ar = ['10.0.0b12', '10.0.0b3', '10.0.0a2', '9.0.10', '9.0.3']

p ar.sort_by { |v| Gem::Version.new(v) }
# => ["9.0.3", "9.0.10", "10.0.0a2", "10.0.0b3", "10.0.0b12"]
19
задан David Grant 31 December 2008 в 03:23
поделиться

6 ответов

Относительно нескольких других ответов это не имеет никакого отношения к датам, реализовываемым в C по сути. __init__ метод ничего не делает, потому что они неизменны объекты, поэтому конструктор (__new__) должен сделать всю работу. Вы видели бы, что то же поведение разделяет на подклассы интервал, ул., и т.д.

>>> import datetime
>>> class D(datetime.date):
        def __new__(cls, year):
            return datetime.date.__new__(cls, year, 1, 1)


>>> D(2008)
D(2008, 1, 1)
36
ответ дан 30 November 2019 в 02:34
поделиться

Вот ответ, и возможное решение (используйте функцию или strptime вместо того, чтобы разделить на подклассы)

http://www.mail-archive.com/python-list@python.org/msg192783.html

4
ответ дан 30 November 2019 в 02:34
поделиться

Считайте ссылку Python на Модель данных , особенно о __new__ специальный метод .

Выборка от той страницы (мой курсив):

__new__() предназначается главным образом для разрешения подклассов [1 110] неизменный , типы (как интервал, ул. или кортеж) к [1 111] настраивают создание экземпляра . Это также обычно переопределяется в пользовательских метаклассах для настройки создания класса.

datetime.datetime также неизменный тип.

пз, Если Вы думаете что:

  • объект, реализованный в C, не может быть разделен на подклассы, или
  • __init__ не становится требовавшимся, C реализовал объекты, только __new__

, затем попробуйте его:

>>> import array
>>> array
<module 'array' (built-in)>
>>> class A(array.array):
    def __init__(self, *args):
        super(array.array, self).__init__(*args)
        print "init is fine for objects implemented in C"

>>> a=A('c')
init is fine for objects implemented in C
>>> 
10
ответ дан 30 November 2019 в 02:34
поделиться

Вы - функция, не обходится; Python просто никогда не переходит к сути дела, где он назвал бы его. Так как дата и время реализована в C, она делает свою инициализацию в datetime.__new__ не datetime.__init__. Это вызвано тем, что дата и время неизменна. Вы могли, по-видимому, обойти это путем переопределения __new__ вместо __init__. Но поскольку другие люди предложили, лучший способ, вероятно, не разделяет дату и время на подклассы вообще.

2
ответ дан 30 November 2019 в 02:34
поделиться

Вы можете переноситься это и добавлять расширенную функциональность к Вашей обертке.

Вот пример:

class D2(object):
    def __init__(self, *args, **kwargs):
        self.date_object = datetime.date(*args, **kwargs)

    def __getattr__(self, name):
        return getattr(self.date_object, name)

И вот то, как это работает:

>>> d = D2(2005, 10, 20)
>>> d.weekday()
3
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattr__',
 '__getattribute__', '__hash__', '__init__', '__module__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__',
 '__weakref__', 'date_object']
>>> d.strftime('%d.%m.%Y')
'20.10.2005'
>>>

Примечание, что dir() не перечисляет datetime.date атрибуты с.

0
ответ дан 30 November 2019 в 02:34
поделиться

Необходимо, вероятно, использовать функцию фабрики вместо того, чтобы создать подкласс:

def first_day_of_the_year(year):
  return datetime.date(year, 1, 1)
0
ответ дан 30 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: