Zambo hat geschrieben:Das mit den Blöcken hat BlackJack schon zugegeben, dass das in Python so nicht möglich ist. Was natürlich schon für sich alleine ein Grund seien kann, Ruby vorzuziehen.
Das ist aber nur ein kosmetischer Unterschied. Man kann halt keine
anonymen Blöcke definieren, na und, dann gibt man dem Kind halt einen Namen und definiert eine lokale Funktion.
Aber bei den Mix-Ins muß ich doch widersprechen. Natürlich kann man Mix-Ins über Mehrfachvererbung realisieren. Aber das Konzept geht bei Ruby doch um einiges weiter, als es bei Python möglich ist. Zum Beispiel möchte ich schon gerne wissen, ob dies in Python auch so möglich wäre?
Code: Alles auswählen
module Summable
def sum
inject { |v,n| v+n }
end
end
class Array
include Summable
end
class Range
include Summable
end
[1,2,3,4,5].sum -> 15
('a'..'m').sum -> "abcdefghijklm"
Das sieht aus nach "zur Laufzeit Basisklassen hinzufügen". Das geht grundsätzlich schon:
Code: Alles auswählen
In [44]: class A:
....: pass
....:
In [45]: class B:
....: def test(self):
....: print 'b'
....:
In [46]: a = A()
In [47]: a.test()
---------------------------------------------------------------------------
exceptions.AttributeError Traceback (most recent call last)
/home/marc/<ipython console>
AttributeError: A instance has no attribute 'test'
In [48]: A.__bases__ += (B,)
In [49]: a.test()
b
Allerdings kann man bei Typen die in C implementiert sind, entscheiden ob die auf diese Weise verändert werden dürfen und das ist bei den eingebauten Typen ist nicht der Fall.
Und das wird in Python auch üblicherweise nicht so gemacht. Wie mawe schon sagte, man zersplittert so die Definition von Klassen.
Wenn man ein generisches Summieren haben möchte, dann definiert man eine entsprechende Funktion.
Code: Alles auswählen
import operator
NO_DEFAULT = object()
def my_sum(iterable, default=NO_DEFAULT):
iterator = iter(iterable)
try:
first = iterator.next()
except StopIteration:
if default is NO_DEFAULT:
raise TypeError('empty iterable without default')
else:
return default
return reduce(operator.add, iterator, first)
print my_sum(('H', 'a', 'l', 'l', 'o')) # -> 'Hallo'
print my_sum(xrange(6)) # -> 15
print my_sum([], 0.0) # -> 0.0
print my_sum('') # Raises Exception.
Nebenbei, was großes soll man auch nicht in den Beispielen entdecken. Es soll nur ein paar Konzepte aufzeigen, die ich in Ruby besonders gelungen finde.
Du hast gesagt Dir fehlen ein paar Dinge in Python, die in Ruby möglich sind und es stellte sich heraus, das vieles davon in Python auch möglich ist.