Chyba trzeba sięgnąć po taki stary, zapomniany skrót jak RTFM. W "przyjaznej" dokumentacji wszystko jest, w tym kilka metod sortowania.
class klasa :
__wartosc = 0
def __init__(self, w) :
self.__wartosc = w
def pokaz(self) :
print(self.__wartosc)
__wartosc
jest zmienną klasy, nie instancji. Pola klasy definiujesz na poziomie klasy, tak jak to właśie zrobiłeś. Zmienne instancji tworzysz albo wyłacznie odwołaniami do self
albo poprzed pole __slots__
(na razie o slotach zapomnij). Prawidłowo powinno być:
class Klasa(object):
def __init__(self, w) :
self.wartosc = w
Dziedziczenie z object
jest w Pythonie 3.x domyślne, ale pisanie wprost jest w dobrym tonie, przynajmniej póki linia 2.x jest dominująca. W tym języku nie ma prawdziwie prywatnych pól. Klasy nazywaj z wielkiej litery. Swap realizuj poprzez równoległe przypisanie, bez zmiennych pomocniczych - x, y = y, x
. Nie rób metod wypisujących obiekt, zaimplementuj metodę __repr__
zwracającą jego tekstową reprezentację i ewentualnie __str__
odpowiedzialną za konwersję na string.
range(0, x)
jest mniej czytelną formą range(x)
, obie formy są równoważne, druga jest swego rodzaju idiomem w Pythonie.
Aby obiekty były porównywalne powinny implementować metodę __cmp__
, chociaż na potrzeby standardowych sortowań można dostarczyć funkcję klucza, zwracającą wartość, po której obiekty będą sortowane.
import random, operator
class Sth(object):
def __init__(self, x=None, y=None, z=None):
def valOrRand(n):
return n if n is not None else random.randint(0, 100)
self.x, self.y, self.z = valOrRand(x), valOrRand(y), valOrRand(z)
def __cmp__(self, other):
return self.x - other.x
def __repr__(self):
return 'Sth({0}, {1}, {2})'.format(self.x, self.y, self.z)
if __name__ == '__main__':
tbl = [ Sth() for n in range(5) ]
print('base:\t{0}'.format(tbl))
# 1
tbl.sort()
print('by x:\t{0}'.format(tbl))
# 2
tbl = list(sorted(tbl, key=lambda s: s.y))
print('by y:\t{0}'.format(tbl))
# 3
tbl.sort(key=operator.attrgetter('z'))
print('by z:\t{0}'.format(tbl))
Kod nie jest idealny, ma natomiast pokazać kilka idiomów typowych dla Pythona. Konstruktor Sth
posiada domyślne argumenty ustawione na None
, wszystko co nie jest None (is not None
) jest akceptowane jako podany argument, dla tego konkretnego przypadku wykonywana jest akcja domyślna - losowanie. Jest to zrealizowane przy użyciu funkcji zdefiniowanej wewnątrz metody, Python pozwala na takie zagnieżdżanie. Zmienna tbl
tworzona jest przy użyciu list comprehension. Pierwsze sortowanie (#1) wykonywane jest stabilnie, w miejscu, poprzez poprzez metodę sort
listy, z użyciem zdefiniowanej w Sth
metody __cmp__
. Następne wykorzystuje ogólną funkcję sortującą, która przyjmuje dowolny iterowalny obiekt i zwraca iterator na posortowane wartości, dlatego też jest on przed przypisaniem konwertowany na listę. Jako klucz używane jest lambda-wyrażenie zwracające pole y
obiektu. W ostatnim wypadku ponownie sortujemy w miejscu, tym razem z obiektem typu attrgetter
z modułu operator
, który zwraca podane w konstruktorze pole z obiektu podanego do metody __call__
(czyli jego wywołania).
Całość kompatybilna z linią 2.x od 2.6 (metoda format
) i całą linią 3.x.