class Ember:
pass
class Matematikus(Ember):
pass
e = Ember()
m = Matematikus()
print(isinstance(e, Matematikus))
print(isinstance(m, Ember))
print(issubclass(Ember, Matematikus))
print(issubclass(Matematikus,Ember))
Ha nem írunk semmilyen osztályt, automatikusan az object
osztály a szülő osztály:
o=object()
class A: pass
class B(object): pass
print(issubclass(A, object))
print(issubclass(B, object))
A metódusok öröklődnek, de felülírhatóak.
class A(object):
def foo(self):
print("A.foo függvény")
def bar(self):
print("A.bar függvény")
class B(A):
def foo(self):
print("B.foo függvény")
b = B()
b.foo()
b.bar()
Mivel az adat attribútumok bárhol létrehozhatóak, csak akkor "öröklődnek", ha a szülő osztályban lévő kód meghívódik.
class A(object):
def foo(self):
self.value = 42
class B(A):
pass
b = B()
print('b',b.__dict__) # a __dict__ kiírja az összes attribútumot
a = A()
print('a',a.__dict__)
a.foo()
print('a',a.__dict__)
print('b',b.__dict__)
b.foo()
print('b',b.__dict__)
dir(a)
a.__dict__
__init__
függvénye. Viszont mivel az __init__
nem egy szokásos konstruktor, így nem hívódik meg automatikusan a szülő osztály init függvénye, ha felülírja a gyerek osztály.class A(object):
def __init__(self):
print("A.__init__ called")
class B(A):
#pass
def __init__(self):
print("B.__init__ called")
class C(A):
pass
b = B()
print("c létrehozása")
c = C()
A szülő osztály metódusai kétféleképpen is elérhetőek
class A(object):
def __init__(self):
print("A.__init__ ")
class B(A):
def __init__(self):
A.__init__(self)
print("B.__init__ ")
class C(A):
def __init__(self):
super().__init__()
print("C.__init__ ")
print("B")
b = B()
print("C")
c = C()
class Polinom:
def __init__(self, lista):
self.ehlista=lista
def __str__(self):
szoveg=""
for i,eh in enumerate(self.ehlista):
szoveg=szoveg+str(eh)+"x^"+str(i)+"+"
szoveg=szoveg.rstrip("+")
return szoveg
def deri(self):
l=[]
for i,eh in enumerate(self.ehlista):
if i==0:
pass
else:
l.append(i*eh)
return Polinom(l)
a=Polinom([1,2,4,5])
print(a)
print(a.deri().deri())
class Masodfoku(Polinom):
def egyikgyok(self):
a=self.ehlista[2]
b=self.ehlista[1]
c=self.ehlista[0]
return (-b+(b**2-4*a*c)**(1/2))/(2*a)
p=Masodfoku([2,3,1])
print(p)
p.egyikgyok()
print(p.deri())
# for ciklusok nélkül is meg tudjuk oldani :)
class Polinom:
def __init__(self, lista):
self.ehlista=lista
def __str__(self):
szoveg="".join([str(eh)+"x^"+str(i)+"+" for i,eh in enumerate(self.ehlista)][::-1])
szoveg=szoveg.rstrip("+")
return szoveg
def deri(self):
l=[i*eh for i,eh in enumerate(self.ehlista) if i!=0]
return Polinom(l)
def beh(self,x):
valasz=sum([eh*x**i for i,eh in enumerate(self.ehlista)])
return valasz
def __add__(self, other):
l=max(len(self.ehlista),len(other.ehlista))
bovitett_eh1=self.ehlista + [0]*(l - len(self.ehlista))
bovitett_eh2=other.ehlista + [0]*(l - len(other.ehlista))
uj_ehlista=[bovitett_eh1[i]+bovitett_eh2[i] for i in range(l) ]
return Polinom( uj_ehlista )
class Masodfoku(Polinom):
def egyikgyok(self):
a=self.ehlista[2]
b=self.ehlista[1]
c=self.ehlista[0]
return (-b+(b**2-4*a*c)**(1/2))/(2*a)
p=Polinom([1,2])
print(p,p.beh(5))
print(p.deri())
m=Masodfoku([1,2,7])
print(m.beh(m.egyikgyok()))
print(p+p)
print(Polinom([1,2,3])+Polinom([2,1]))
class sarkany:
def __init__(self, nev):
self.nev=nev
class repulo_sarkany(sarkany):
def __init__(self, nev, szarnyfesztav):
super().__init__(nev)
self.szarnyfesztav=szarnyfesztav
def tamadas(self):
print("A", self.nev, "nevű sárkány a levegőből rád vetette magát", )
def repules(self):
print("A", self.nev, "nevű sárkány repül", )
smaug=repulo_sarkany("Smaug",12)
smaug.repules()
smaug.tamadas()
smaug.szarnyfesztav
class tuzokado_sarkany(sarkany):
def __init__(self, nev):
super().__init__(nev)
def tamadas(self):
print("A", self.nev, "nevű sárkány szénné égetett", )
def tuzokadas(self):
print("A", self.nev, "nevű sárkány a tüzet okád", )
susu=tuzokado_sarkany("Süsü")
susu.tuzokadas()
susu.tamadas()
class repulo_tuzokado_sarkany(repulo_sarkany,tuzokado_sarkany):
def __init__(self, nev, szarnyfesztav):
self.nev=nev
self.szarnyfesztav=szarnyfesztav
def tamadas(self):
tuzokado_sarkany.tamadas(self)
viserion=repulo_tuzokado_sarkany("Viserion",25)
viserion.repules()
viserion.tuzokadas()
viserion.tamadas()
Azt, hogy melyik hívódik meg, az MRO (Method Resolution Order) határozza meg. Ez egy sorrend az osztályokon, és egy metódus hívásnál addig megy a sorrendben még meg nem találja valamelyik osztályban a metódust. Nem pontosan így működik, de ökölszabálynak jó, hogy felfelé mélységi kersést végez, balról jobbra sorrendben.
import sys
", ".join(dir(sys)) # a dir függvény megadja az objektum attribútumait és metódusait.
'__breakpointhook__, __displayhook__, __doc__, __excepthook__, __interactivehook__, __loader__, __name__, __package__, __spec__, __stderr__, __stdin__, __stdout__, _base_executable, _clear_type_cache, _current_frames, _debugmallocstats, _enablelegacywindowsfsencoding, _framework, _getframe, _git, _home, _xoptions, api_version, argv, base_exec_prefix, base_prefix, breakpointhook, builtin_module_names, byteorder, call_tracing, callstats, copyright, displayhook, dllhandle, dont_write_bytecode, exc_info, excepthook, exec_prefix, executable, exit, flags, float_info, float_repr_style, get_asyncgen_hooks, get_coroutine_origin_tracking_depth, get_coroutine_wrapper, getallocatedblocks, getcheckinterval, getdefaultencoding, getfilesystemencodeerrors, getfilesystemencoding, getprofile, getrecursionlimit, getrefcount, getsizeof, getswitchinterval, gettrace, getwindowsversion, hash_info, hexversion, implementation, int_info, intern, is_finalizing, maxsize, maxunicode, meta_path, modules, path, path_hooks, path_importer_cache, platform, prefix, ps1, ps2, ps3, set_asyncgen_hooks, set_coroutine_origin_tracking_depth, set_coroutine_wrapper, setcheckinterval, setprofile, setrecursionlimit, setswitchinterval, settrace, stderr, stdin, stdout, thread_info, version, version_info, warnoptions, winver'
import random
type(random)
module
importálás után modulnev.attribútum
alakban érjük el a modul tartalmát.
random.choice([3,4,5])
3
A notebookal azonos mappában készítsünk egy mod.py fájlt.
import mod
dir(mod)
['Foo', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'foo', 's']
print(mod.a)
mod.foo(1)
print(mod.s)
[100, 200, 300] arg 1 If Comrade Napoleon says it, it must be right.
from modulnév import almodul
Az almodult ezután almodul
néven érjük el és nem modulnév.almodul
néven.
from os import path
try:
os
except NameError:
print("os nincs definiálva")
try:
path
print("path megtalálva")
except NameError:
print("path nincs definiálva")
try:
os.path
print("os.path megtalálva")
except NameError:
print("os.path nincs definiálva")
os nincs definiálva path megtalálva os.path nincs definiálva
Az as
kulcssszó segítségével megadhatunk egy másik nevet is:
import numpy as np
import os as os_module
try:
os
except NameError:
print("os nincs definiálva")
try:
os_module
print("os_module megtalálva")
except NameError:
print("os_module nincs definiálva")
os nincs definiálva os_module megtalálva
import os, sys
from sys import stdin, stderr, stdout
from argparse import ArgumentParser
import inspect
inspect.isclass(ArgumentParser)
True
from modulnév import *
után a modul teljes tartalma elérhető a modulnév.
nélkül.
NAGYON NEM AJÁNLOTT mert tudtunkon kívül felülírhatunk dolgokat.
def stat():
print("Én egy statisztika vagyok")
stat()
from os import *
stat()
Én egy statisztika vagyok
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-16-23a9072a8c0d> in <module> 3 stat() 4 from os import * ----> 5 stat() TypeError: stat() missing required argument 'path' (pos 1)
stat
import wikipedia
Ha ModuleNotFoundError
-t kapunk, akkor a Python nem találta meg a számítógépünkön a modult. Ekkor általában az a gond, hogy tényleg nincs is a gépünkön, így instalálni kell.
A pip program automatikusan telepítődik az Anaconda keretében. Windowson az Anaconda Promptból érjük el, Linuxon pedig a terminálból. Használat:
pip install modulnev
Modul instalálása pip uninstall modulnev
Modul törlésepip list
Instalált modulok listája Olyan packageket tudunk installálni amik megtalálhatóak a PyPi-ben. (https://pypi.org/)
!pip list # a ! a mögötte lévő parancsot lefuttatja a terminálban
Részletek: https://docs.python.org/3/library/
Numeric and Mathematical Modules
Functional Programming Modules