:)
Metis: Dziadku
Kiedyś napisałeś:
"class Parent:
pass
class Child1(Parent):
pass
class Child2(Parent):
pass
if __name__ == '__main__':
Parent.x = 1
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Child2.x = 3
print(Parent.x, Child1.x, Child2.x)
Parent.x = 4
print(Parent.x, Child1.x, Child2.x)
Jaki będzie wydruk na ekran? "
Jaki będzie ten wydruk
![](emots/2/chytry.gif)
?
14 gru 22:21
Dziadek Mróz:
![rysunek](rys/127563.png)
Parent Child1 Child2
x brak brak brak
Parent.x = 1
print(Parent.x, Child1.x, Child2.x)
Parent Child1 Child2
x 1 1 1
Child1 i Child2 dziedziczą po Parent oraz inicjalizujemy zmienną globalną klasy
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent Child1 Child2
x 1 2 1
Zgodnie ze schematem dziedziczenia tylko Child1 zmienia swój x
Child2.x = 3
print(Parent.x, Child1.x, Child2.x)
Parent Child1 Child2
x 1 2 3
Zgodnie ze schematem dziedziczenia tylko Child2 zmienia swój x
Parent.x = 4
print(Parent.x, Child1.x, Child2.x)
Parent Child1 Child2
x 4 2 3
Child1 i Child2 mają swoje x, więc zmienia się tylko Parent.x
15 gru 00:10
Metis: Wow
15 gru 00:25
Metis: Ile zajeła Ci nauka tego wszystkiego?
![emotka](emots/1/smutny.gif)
Na uczelniach takich rzeczy nie uczą.
15 gru 00:32
52: Nie uczą i nie będą uczyć
15 gru 00:38
Dziadek Mróz:
Tego się samemu musisz nauczyć
15 gru 00:39
Metis: Wiem
![emotka](emots/1/wesoly.gif)
Zazdroszczę wiedzy
15 gru 00:40
Metis: Gdzie można więcej poczytać o programowaniu obiektowym−klasach, strukturach, destr/konst. itd
od 0 do pewnego stopnia zaawnsowania?
Może być po ang
![emotka](emots/1/wesoly.gif)
W sieci jest tego mnóstwo. Polecisz mi coś?
15 gru 01:53
Dziadek Mróz: google.com
15 gru 15:10
Metis: Dzięki
15 gru 16:13
Dziadek Mróz:
Klasy w Pythonie są bardzo proste:
class Klasa:
counter = 0
def __init__(self, d = 1):
type(self).counter += 1
self.data = d
def __del__(self):
type(self).counter −= 1
if __name__ == '__main__':
k1 = Klasa()
k2 = Klasa(2)
k3 = Klasa(3)
'''
Klasa.data nie jest atrybutem klasy
Klasa.counter jest atrybutem klasy (jest taki sam dla wszystkich instancji tej klasy)
k1.data jest atrybutem obiektu
k1.counter jest atrybutem klasy do czasu aż nie zdefiniujemy atrybutu obiektu o
takiej nazwie
'''
print(Klasa.counter, k1.counter, k2.counter, k3.counter)
# 3 3 3 3
del k3
print(Klasa.counter, k1.counter, k2.counter)
# 2 2 2
k1.counter = 8 # k1.counter przestał być atrybutem klasy i stał się atrybutem obiektu
print(Klasa.counter, k1.counter, k2.counter)
# 2 8 2
Klasa.counter = 5
print(Klasa.counter, k1.counter, k2.counter) # k2.counter ciągle jest atrybutem klasy
# 5 8 5
15 gru 16:22
Dziadek Mróz:
funkcja type() zwraca typ danej zmiennej, ew. nazwę klasy jaką przedstawia obiekt
słówko kluczowe self oznacza obiekt na jakim się opieramy w definicji klasy
więc type(self) zwróci nam w tym przypadku typ Klasa
15 gru 16:24
Dziadek Mróz:
F F F FRISTAJLO!
16 gru 18:58
bezendu:
"Szkoła programowania"
16 gru 23:03
maths: Na uczelniach nie uczą takich rzeczy jak programowanie obiektowe? Chyba nie do końca jest to
prawdą
![emotka](emots/1/mruga.gif)
Nie obniżajmy rangi studiów, bo na niektórych uczelniach poziom jest naprawdę wysoki
i takie rzeczy są absolutnymi podstawami.
17 gru 12:24
Metis: Oczywiście
17 gru 14:12
52: maths ja mam na myśli różnicę, pomiędzy wymaganiem a uczeniem
![emotka](emots/1/wesoly.gif)
Wymagając od studentów, uczelnia narzuca swój standard, ale czy prowadzący wytłumaczą/nauczą to
już inna kwestia.
17 gru 14:30
bezendu:
Zależy jakiego prowadzącego trafisz.
17 gru 16:18
Dziadek Mróz:
Na mojej uczelni prowadzący tylko pokazał drzwi a kto przez nie przeszedł to inna bajka.
Slajdy z teorią i praktyka na wysokim poziomie po tygodniu pisania w domu, ot co
17 gru 20:29
Metis: Udzielasz korepetycji ?
17 gru 20:36
Dziadek Mróz:
Nie
18 gru 02:43
Mariusz:
Może to i lepiej bo z tego że co nieco wie nie wynika że umie to przekazać
o czym już wspominałem
Z tymi korepetycjami to powinieneś uważać bo ogłaszają się też tacy którzy
nie potrafią napisać kodu
18 gru 03:07
Dziadek Mróz:
Po robocie nie gadam o robocie
18 gru 05:05
Mariusz:
Metis jak chcesz zadać jakieś pytanie to idź lepiej na takie fora jak np stack overflow
tam prędzej ci odpowiedzą o ile znasz angielski
Nie polecam takich forów jak 4programmers bo nie dość że nie odpowiadają sensownie
to jeszcze wyrzucają wątki do kosza bez uzasadnienia
18 gru 05:53
Mariusz:
Metis chcesz zadanie z programowania ?
Na razie nie z obiektowego
Usuwaniem rekurencji się bawiłeś
18 gru 16:37
bezendu:
Mariusz C# znasz ?
18 gru 17:16
Mariusz:
~15 lat temu miałem C oraz C++ razem z Pascalem
a później trochę Javą się bawiłem
Jednak tylko podstawy
18 gru 20:24
Mariusz:
bezendu przypuśćmy że mamy rekurencyjną funkcję scalającą dwie posortowane listy
Jak przepisać tę funkcję iteracyjnie , dodatkowo dobrze byłoby zwracaną wartość wywalić
do listy parametrów
struct node* SortedMerge(struct node* a, struct node* b)
{
struct node* result = NULL;
/* Base cases */
if (a == NULL)
return(b);
else if (b==NULL)
return(a);
/* Pick either a or b, and recur */
if (a−>data <= b−>data)
{
result = a;
result−>next = SortedMerge(a−>next, b);
}
else
{
result = b;
result−>next = SortedMerge(a, b−>next);
}
return(result);
}
18 gru 20:34
Dziadek Mróz:
Najlepiej rozbij to na kilka funkcyj
19 gru 05:21
Mariusz:
To ma być jedna funkcja dwa wywołania rekurencyjne przywołują pomysł użycia
dwóch pętli np while jeśli tak to jakie by miały być warunki logiczne sterujące tą pętlą
aby nie wyskakiwać z nich jakimiś instrukcjami typu goto
Z drugiej strony ciekawe czy można wykorzystać tę pętlę z procedury dla tablic
chociaż z listami jest trochę inaczej bo aby ją posortować wystarczy pozamieniać wskaźniki
Trzeba to jednak tak zrobić aby zachować oryginalną kolejność powtarzających się kluczy
19 gru 11:44