@jerch: Warum `len()` auf eine Liste statt `sum()`? Und auf der anderen Seite dann einen Generatorausdruck bevorzugen, dass passt IMHO nicht zusammen.
@LiLaLaunebär: Ich fände hier ``sum(1 for x in xs if isinstance(x, Product))`` recht leserlich.
Ich kenne den genauen Anwendungszweck ja nicht, aber normalerweise versucht man bei OOP über die Eigenschaften statt über den Typ eines Objekts zu gehen. `isinstance()` ist nämlich nicht nur bei "duck typing" ungern gesehen, sondern auch bei statisch typisierten OO-Sprachen ist eine Typprüfung ein "code smell".
Bei Deinem `Nix` könnte man zum Beispiel vielleicht das "Null-Objekt"-Entwurfsmuster verwenden, das heisst ein Singleton erstellen, das die Eigenschaften eines Produkts hat was "nichts" ist.
Code: Alles auswählen
class Product(object):
def __init__(self):
self.name = "lala"
self.weight = 5
class _Nix(object):
self.name = None
self.weight = 0
NIX = _Nix()
Jetzt kann man problemlos das Gesamtgewicht von einer Liste mit Produkten und "Nichts"-Exemplaren bilden, ohne `NIX` irgenwie besonders behandeln zu müssen. `NIX` wiegt halt nix.
Und da es Sinn macht (IMHO) nur ein "Nichts" zu haben, kann man auch Tests auf die Identität von `NIX` machen wenn man die zum Beispiel rausfiltern möchte.