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"]
Относительно нескольких других ответов это не имеет никакого отношения к датам, реализовываемым в 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)
Вот ответ, и возможное решение (используйте функцию или strptime вместо того, чтобы разделить на подклассы)
http://www.mail-archive.com/python-list@python.org/msg192783.html
Считайте ссылку Python на Модель данных , особенно о __new__
специальный метод .
Выборка от той страницы (мой курсив):
__new__()
предназначается главным образом для разрешения подклассов [1 110] неизменный , типы (как интервал, ул. или кортеж) к [1 111] настраивают создание экземпляра . Это также обычно переопределяется в пользовательских метаклассах для настройки создания класса.
datetime.datetime
также неизменный тип.
пз, Если Вы думаете что:
__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
>>>
Вы - функция, не обходится; Python просто никогда не переходит к сути дела, где он назвал бы его. Так как дата и время реализована в C, она делает свою инициализацию в datetime.__new__
не datetime.__init__
. Это вызвано тем, что дата и время неизменна. Вы могли, по-видимому, обойти это путем переопределения __new__
вместо __init__
. Но поскольку другие люди предложили, лучший способ, вероятно, не разделяет дату и время на подклассы вообще.
Вы можете переноситься это и добавлять расширенную функциональность к Вашей обертке.
Вот пример:
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
атрибуты с.
Необходимо, вероятно, использовать функцию фабрики вместо того, чтобы создать подкласс:
def first_day_of_the_year(year):
return datetime.date(year, 1, 1)