Erinevus lehekülje "Python" redaktsioonide vahel

Allikas: Kuutõrvaja
(Andmestruktuurid)
(OOP)
646. rida: 646. rida:
 
===OOP===
 
===OOP===
  
TODO
+
class nimed:
 +
  def __init__(self, domeeninimi, omanik ):
 +
    self.domeeninimi = domeeninimi
 +
    self.omanik = omanik
 +
    self.ttl = 86400
 +
 +
  def suurendattl(self, kordaja):
 +
    self.ttl = self.ttl * kordaja
 +
 +
if __name__ == '__main__':
 +
 +
  # objektid moodustamine
 +
  eesti = nimed(domeeninimi = 'eesti.ee', omanik = 'Calevipoeg')
 +
  tartu = nimed(domeeninimi = 'tartu.ee', omanik = 'Dor Batt')
 +
 +
  # too objektidega 
 +
  eesti.suurendattl(2)
 +
 +
  # tulemuste esitamine
 +
  print eesti.omanik
 +
  print (eesti.ttl)
  
 
===Kasulikud lisamaterjalid===
 
===Kasulikud lisamaterjalid===

Redaktsioon: 28. veebruar 2010, kell 21:53

Sissejuhatus

Python http://www.python.org/ on suhteliselt populaarne programmeerimiskeel, millele peetakse iseloomulikuks

  • kasutamise lihtsus, st kiiresti õpitav ja saab kiiresti jõuda kasutatavate tulemusteni
  • keele küpsus
  • sobib mitmekesiste ülesannete lahendamiseks (ingl. k. general purpose language)
  • sunnib kasutajat kirjutama nö loetavat programmi
  • Python on skriptimiskeel st programmid on koheselt käivitatavad ja ei vaja kompileerimist
  • Python sisaldab objektorienteeritud programmeerimise (OOP) võimalusi, kuid neid ei pea tingimata kasutama (käesoleva teksti punkt Python#OOP on pühendatud sellele)

2010 aastal on levinud kasutada kahte erinevat Pyhton keele põlvkonda, sõltuvalt kasutusalast võib see olla oluline, kumba konkreetsel juhul eelistada

  • 2.x - juba pikka aega kasutuses olnud versioon, mida jätkuvalt toetatakse
  • 3.x - uuem versioon, millega reeglina vana versiooni jaoks kirjutatud programmid ei tööta; nt print direktiiv ja teksti vs binari failide käsitluse osa on oluliselt muutunud

Järgnev tekst on koostatud nö kokaraamatu (ingl. k. cookbook) vormis, keskendutud on süsteemiadministreerimisel vajalikele kasutusjuhtumitele, nt meili saatmine, http, ldap ja dns päringute esitamine, kodeeringutega tegelemine jms kasutades seejuures Pyhtoni teekide võimalusi.

Esitatud tekst kehtib v.2.x kohta kui teksti sees ei ole versiooni täpsustatud.

Pythoni paigaldamine

Debian Lenny paketihalduses on olemas kaks Pythoni versiooni

  • 2.5.2 - vaikimisi
  • 2.4.6 - võimalik lisaks paigaldada

Python v. 2.5.2 paigaldmiseks sobib öelda (tegelik paketinimi on python2.5)

# apt-get install python

Programmeerimine Pyhtonis

Üldiselt võib väita, et programm 'teeb midagi millegagi', konkreetsemalt sobib kujutleda Pythoni kasutamist sellise hierarhiana

  • programmid koosnevad moodulitest
  • moodulid koosnevad lausetest (ingl. k. statement)
  • laused koosnevad avaldistest (ingl. k. expression)
  • avaldised tekitavad ja töötlevad objekte

Pyhtoni objektid on

  • dynamically typed - st, et nt muutujate väärtustamisel ei pea nende tüüpe kirjeldama
  • strongly typed - erinevat tüüpi muutujatega ei saa teha teatud operatsioone, nt liita arv ja sõne

Pythoni interpretaator

Pyhtoni interpretaatori kasutamine interaktiivses režiimis toimub selliselt

 $ python
 Python 2.5.2 (r252:60911, Jan 24 2010, 14:53:14) 
 [GCC 4.3.2] on linux2
 Type "help", "copyright", "credits" or "license" for more information.
 >>> a="tervist"
 >>> print a
 tervist
 >>> Ctrl+D

Interpretaator sobib nt kalkulaatorina kasutamiseks

 >>> 21.0/8
 2.625

Pythoni skript

Pythoni skript esineb tekstifaili kujul, kusjuures sisu kirjutamisel tuleb jälgida, et tulemust mõjutab ka ridade alguses kasutatud tühikute hulk, st intendatsioon. Nt selline skript kirjutab välja arvud ühest kolmeni

 for i in range(3):
   print i + 1

kus

  • range(3) funktsioon tekitab massiivi elementidega 0, 1, 2 ja 3
  • for kordus tegeleb järjekorras kõigi elementidega
  • print esitab i + 1 avaldise väärtuse iga for korduse jaoks

Skripti käivitamiseks sobib öelda

 $ python skript.py
 1
 2
 3

Alternatiiviks on lisada faili algusse rida interpretaatori nimega

 #!/usr/bin/python
 
 for i in range(3):
   print i+1

ning muuta fail käivitatavaks

 $ chmod 0755 skript.py

ning käivitada

 $ ./skript.py

Tavaliselt skripti käivitamisel tekitatakse automaatselt samasse kataloogi skriptiga samanimeline fail, mille nime lõpus on .pyc. See on skriptile vastav byte-code järgnevus, mida võimalusel Python edasistel skripti käivitamistel kasutab.

Lisaks töötavatele ridadele võib skriptis esineda kommentaare, kõike # märgist paremale jäävat käsitletakse kommentaarina.

Sõne-operatsioonid

Sõnedega (ingl. k. string) saab teha selliseid operatsioone

  • omistada muutujale ja esitada
linn = "Tartu"
print linn
  • liita
linn = "Tartu"
print "Asukoht " + linn

Failioperatsioonid

Tekstifailist lugemiseks sobib kasutada nt sellist järgnevust

for rida in open ('urlid.txt'):
  print rida.rstrip()

kus

  • rstrip() eemaldab rea lõpust reavahetuse märgi
  • lugemine toimub for tsükli abil rida haaval

Tekstifaili kirjutamiseks sobib kasutada nt sellist järgnevust

read=('loomaaed.tartu.ee', 'kuutorvaja.eenet.ee', 'www.eesti.ee')
myfile = open ('urlid','w')

for rida in read:
  myfile.write (rida + '\n')

myfile.close()

kus

  • myfile = open ('urlid','w') - tekstifail urlid avatakse lugemiseks ja kirjutamiseks
  • read - on tuple element, mis on massiivi moodi konstruktsioon, kuid mille sisu ei saa peale moodustamist muuta
  • kirjutamine toimub for tsüki abil rida haaval

Andmestruktuurid

Pyhtonis kasutatavad enamlevinud andmestruktuurid on

  • sõne
  • arv
  • massiiv
  • tuple
  • sõnastik

Sõne

Sõne (ingl. k. string) on järgnevus tähti-numbreid-muid-sümboleid

 'abcdefgh'

Arv

Arv võib olla nt täisarv või ujukomaarv

 15

Massiiv

Massiiv (ingl. k. list) on järjestatud hulk

massiivinimi = ['yks', 'kaks', 'kolm']

Massiivi elemendi poole pöördumine toimub selliselt

print massiivinimi[1]

Tuple

tuple on järjestatud hulk, mis erineb massiivist nt selle poolest, et selle elemente ei saa muuta

 ('yks', 'kaks', 'kolm')

Sõnastik

Sõnastik (ingl. k. dictionary) on key-value paaridest koosnev järjestamata hulk

 sonastik = { 'priit': 167, 'mart': 196 }

Sõnastiku elemendi väärtuse esitamine toimub nii

 print sonastik['priit']

Andmetüüpide teisendused

Pyhtonis ei saa erinevat tüüpi andmeid tehtes kasutada, nt ei saa liita arve ja sõnesid, eelnevalt tüleb tüüp teisendada

 'mina tulen kell ' + str(10)

Funktsioonid

Funktsioonid võimaldavad üldiselt kahte asja

  • korraldada programmi osade korduvkasutust
  • jagada programmi loogilisteks osadeks

Funktsioon kireldatakse def direktiivi abil, nt selliselt

 def korrutamine(x, y):
   return x * y
 
 print korrutamine(15, 3)

kus

  • esimesed kaks rida kirjeldavad funktsiooni
  • viimases reas toimub funktsiooni väljakutse

Pythoni funktsioonide kohta öeldaks, et nad on polümorfsed, st nad töötavad suvaliste sisendaandmetega eeldusel, et funktsioonis kirjeldatud operatsioone saab sooritada nende andmetega. Nt sobiks ülaltoodud funktsiooni välja kutsuda selliselt

 print korrutamine ('mina ', 3)

Funktsiooni dokumentatsioon

Pythoni programmi saab lisada dokumentatsiooni nt vastava funktsiooni juurde

 def korrutamine(x, y):
   """Korrutaja
 
 Korrutab
 """
 
   return x * y

Sellist dokumentatsiooni saab lugeda nt selliselt

 print korrutamine.__doc__

Moodulid

Moodulite abil organiseeritakse programmi teksti kõige üldisemal tasemel. Nt esitatud moodul vastab failile aritmeetika.py ning seal on kirjeldatud üks muutuja ning kaks funktsiooni

$ cat aritmeetika.py
pii = 3.14

def liida(x, y):
  return x + y
 
def lahuta(x, y):
  return x - y

Seda moodulit kasutab nt selline skript

import aritmeetika

print "Pii väärtus on ", aritmeetika.pii
print aritmeetika.liida(2, 3)

Kui mooduli poole pöördumiseks kasutatakse konstruktsiooni 'mooduli-failnimi.moodulis-kirjeldatud-objekt', nagu näitest on näha võib see objekt olla muutuja või funktsioon.

Tehniliselt on kõik Pyhtoni skriptid moodulid.

Parasjagu kasutada oleva süsteemi moodulirada näeb öeldes

>>> import sys
>>> print sys.path
[' ', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', \
  '/usr/lib/python2.5/lib-dynload',  '/usr/local/lib/python2.5/site-packages', \
  '/usr/lib/python2.5/site-packages', '/usr/lib/pymodules/python2.5']

kus listi esimene element on tegelikult 'kaks ülakoma järjest', mis tähistab käesolevat kataloogi. Importimisel otsib Pyhton otsib moodulid järjest nendest kataloogidest, otsinguteele saab lisada katalooge keskkonnamuutuja PYTHONPATH abil, nt

 $ export PYTHONPATH=/opt/pyhton-libs

Moodulis kirjeldatud objektide nimekirja küsimiseks sobib öelda

>>> import moodulinimi
>>> dir(moodulinimi)
['__builtins__', '__doc__', '__file__', '__name__', 'korrutaja', 'pii']

Nimeruum

Peale programmi sisse mooduli importimist saab tema objektide poole pöörduda kujul

 moodulinimi.objektnimi

Öeldakse, et programmi jaoks on tekkinud mooduli nime ja seal kirjeldatud objektide nimedele vastav nimeruum (ingl. k. namespace).

Paketid

Lisaks failidele saab mooduleid paigutada spetsiaalselt moodulite hoidmiseks moodustatud kataloogidesse. Sellist kataloogi nimetatakse paketiks (ingl. k. package) ja seal peab sisalduma fail __init__.py. Paketi kujul esitatud moodulite laadimiseks tuleb programmis öelda

 import katalooginimi

Seejuures täidetakse esmalt __init__.py faili sisu, see fail võib olla ka tühi, ning seejärel kõik kataloogis olevad moodulitele vastavad failid.

Paketi kataloogistruktuur võib olla ka mitmetasemeline, üldiselt toimub moodulis kirjeldatud objektide kasutamine selliselt

 katalooginimi1.katalooginimi2.funktsiooninimi()

HTTP

Skript http päringu vastuse päise elemendi esitamiseks

import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.getheader('last-modified')

Lihtsa HTTP serveri, mis serveerib üle HTTP käesoleva kataloogi sisu, saab käivitada selliselt

 $ python -m SimpleHTTPServer 8080
 Serving HTTP on 0.0.0.0 port 8080 ...

SMTP

Skript saadab smtp serveri kaudu välja kirja

import smtplib

fromaddr = "From: Priit Kask <priit@loomaaed.tartu.ee>"
toaddrs  = "To: Mart Kask <mart@loomaaed.tartu.ee>"

msg = fromaddr + "\n" + toaddrs + "\nSubject: test" + "\nkirja sisu"

server = smtplib.SMTP('192.168.1.250')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

try-except-else konstruktsioon

Skript

  • kirjeldab massiivi URLID
  • käib läbi massiivis URLID toodud hostide /index.html ressursid
  • kui ressursi poole ei õnnestu pöörduda püütakse see try/except poolt kinni
import httplib

URLID = ('www.python.org',
         'kuutorvaja.eenet.ee',
         'seda.pole')

for i in URLID:
  try:
    conn = httplib.HTTPConnection(i)
    conn.request("GET", "/index.html")
  except:
    print "ei saa avada http://" + i + "/index.html"
  else:
    r1 = conn.getresponse()
    print i + " " + r1.getheader('content-length')

Käivitamisel esitatakse nt selline väljund

$ python for.py
www.python.org 16961
kuutorvaja.eenet.ee 267
ei saa avada http://seda.pole/index.html

Unicode

Skript UTF-8 formaadis faili kirjutamiseks (sisuks on Ä ja à tähed)

file = open('utf8data.txt', 'w', encoding='utf-8')
size = file.write('\xc4\xc3\n')
file.close ()

PostgreSQL andmebaasi kasutamine

Psycopg http://initd.org/psycopg/ võimaldab Pythonist kasutada PostgreSQL andmebaasi. Tarkvara paigaldamiseks Debian operatsioonisüsteemis sobib öelda

# apt-get install python-psycopg2

Skript küsib andmebaasist public.kasutajad tabelist kahte väärtust

import psycopg2
conn = psycopg2.connect("dbname=baasinimi host=192.168.1.247 user=kasutajanimi password=kasutajaparool")
cur = conn.cursor()
cur.execute("SELECT nimi, vanus FROM kasutajad where nimi = 'Priit Kask';")
read = cur.fetchall()

for rida in read:
  print ('Nimi: %s, vanus: %s' % rida)

cur.close()
conn.close()

kus

  • cur.fetchall() tagastab vastused tupledena

DNS

Pyhtoni seest DNS kasutamiseks sobib kasutada dnspython http://www.dnspython.org/ tarkvara, paigaldamiseks Debian keskkonnas tuleb öelda

# apt-get install python-dnspython

Selline skript esitab tekstifailis toodud domeeninimedele vastavate A kirjete ip aadressid

import dns.resolver

for rida in open ('hostid'):

  try:
    answers = dns.resolver.query(rida.rstrip(), 'A')
    for rdata in answers:
      print rida.rstrip() + " " + str(rdata)

  except dns.resolver.NXDOMAIN:
    print ('Domeeninimel %s puudub A kirje' % rida.rstrip())

LDAP

Pythoni seest LDAP kataloogi kasutamiseks sobib tarkvara python-ldap http://www.python-ldap.org/, paigaldamiseks Debian keskkonnas tuleb öelda

# apt-get install python-ldap

Skript LDAP kataloogist päringu tegemiseks, küsitakse kõik andmed

import ldap
l = ldap.initialize('ldap://192.168.1.247')
result_set = l.search_s('dc=loomaaed,dc=tartu,dc=ee',ldap.SCOPE_SUBTREE,'(objectClass=*)',['cn', 'uid', 'loginShell'])

for i in result_set:
  print i

Tulemuseks olev result_set on list tupledest, viimane for tsükkel esitab nende tuplede väärtused, üks real.

Help kasutamine

>>> help()

Welcome to Python 2.5!  This is the online help utility.

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://www.python.org/doc/tut/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics".  Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".

help> 

Sisestades help> prompti järele huvipakkuva mooduli nime saab selle mooduli kohta teavet, nt

help> smtplib

Help on module smtplib:

NAME
    smtplib - SMTP/ESMTP client class.

FILE
    /usr/lib/python2.5/smtplib.py

MODULE DOCS
    http://www.python.org/doc/current/lib/module-smtplib.html

DESCRIPTION
    This should follow RFC 821 (SMTP), RFC 1869 (ESMTP), RFC 2554 (SMTP
    Authentication) and RFC 2487 (Secure SMTP over TLS).
...

Programmide käivitamine shellist

Aadressil http://jimmyg.org/blog/2009/working-with-python-subprocess.html on toodud mitmeid näiteid subprocess mooduli kasutamise kohta

import subprocess
pipe = subprocess.Popen(["df", "-h"], stdout=subprocess.PIPE)
print pipe.communicate()[0]

Väljastatakse kahe elemendilise tuple esimene element.

UDP sõnumi saatmine

Aadressil 192.168.10.35:514/udp töötavale syslogile sõnumi saatmiseks sobib selline järgnevus

import socket
port = 514
host = "192.168.10.35"
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto("test sonum\n", (host, port))

Fork'i kasutamine

Forkimise teel saab käivitada paralleelselt mitmeid protsesse. Forkimisel moodustatakse olemasolevast protsessist koopia, ning edasi töötab arvutis kaks protsessi

  • parent - protsessi, milles toimus fork funktsiooni väljakutse
  • child - fork tulemusena tekkinud uus protsessi

Põhimõtteliselt töötab programmi forkimine selliselt, tulemusena on käivitatud töötavast programmist juurde teine eksemplar

import os

def child( ):
  print 'Siin laps',  os.getpid( )
  os._exit(0)  # else goes back to parent loop

def parent( ):
  while 1:
    newpid = os.fork( )
    if newpid == 0:
      child( )
    else:
      print 'Siin vanem ', os.getpid( ), newpid
    if raw_input( ) == 'q': break

parent( )

kus

  • def parent ( ) - kirjeldab funktsiooni, mis programmi täitmisel esmalt käivitatakse
  • def child ( ) - kirjeldab funktsiooni, mille täitmine kutsutakse parent funktsioonist välja
  • parent funktsioonis toimub os.fork() funktsiooni väljakutse, mille tulemusena arvuti mälus on kaks samasisulist programmi, millest üks on vanem ja teine laps; nende edasi töötamisel laps puhul on rahuldatud tingimus 'if netpid == 0' ning muul juhul on tegu vanemaga
  • programmi töö lõpetab while kordusest q sisestuse abil väljumine

Forkimise järel aga ei pea laps olema tingimata sama sisuga kui vanem, näiteks alltoodud skript kasutab os.execlp funktsiooni asendades lapse programmi funktsiooni argumendiks olevate väärtustele vastava tegevusega kopeerides ftp serverist faile

import os

filesetid = ('bsd', 'base46.tgz', 'comp46.tgz', 'etc46.tgz', 'man46.tgz', 'misc46.tgz')

for fileset in filesetid:
  pid = os.fork()
  if pid == 0:
    os.execlp('wget', 'wget', '-q', 'http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/' + fileset)
    assert False, 'error starting program'

  else:
    print 'fileset: ', pid

raw_input( )

Skripti töötamise ajal paistavad protsessitabelis sellised sissekanded

# ps auf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
priit     31463  0.0  0.2  19040  2076 pts/2    S<s  06:30   0:00 -bash
priit     32009  0.1  0.4  16420  3068 pts/2    S<+  08:03   0:00  \_ python fork-dl.py
priit     32010  0.0  0.2  26372  2036 pts/2    S<+  08:03   0:00      \_ wget -q http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/bsd
priit     32011  0.2  0.2  26372  2032 pts/2    S<+  08:03   0:00      \_ wget -q http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/base46.tgz
priit     32012  0.1  0.2  26372  2036 pts/2    S<+  08:03   0:00      \_ wget -q http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/comp46.tgz
priit     32013  0.1  0.2  26372  2028 pts/2    S<+  08:03   0:00      \_ wget -q http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/etc46.tgz
priit     32014  0.0  0.2  26372  2032 pts/2    S<+  08:03   0:00      \_ wget -q http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/man46.tgz
priit     32015  0.0  0.2  26372  2032 pts/2    S<+  08:03   0:00      \_ wget -q http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/misc46.tgz

Lõime kasutamine

Lõimed võimaldavad sarnaselt protsesside forkimisele korraldada paralleelselt tegevusi, kuid selle erinevusega, et kõik tegevused toimuvad ühe ja sama protsessi sees. Võrreldes protsessidega on lõimedele iseloomulik, et kõik lõimed jagavad omavahel mitmeid ressursse, nt globaalseid muutujaid ja seega erinevate lõimede vahel võib olla mõnel juhtumil lihtsam korraldada andmevahetust kui erinevate protsesside vahel.

Lõime (ingl. k. thread) kasutamine toimub põhimõtteliselt selliselt

import thread

def child(tid):
  print 'Tervist loimest nr', tid

def parent( ):
  i = 0
  while 1:
    i = i+1
    thread.start_new(child, (i,))
    if raw_input( ) == 'q': break

 parent( )

kus

  • skript käivitab funktsiooni parent ( )
  • parent ( ) seest kutsutakse välja while korduse sees thread.start_new() abil lõimena funktsioon child()
  • thread.start_new() täitmise lõppu ootamata liigutakse skriptis edasi

Järgnev skript kopeerib ftp serverist faile

import thread
import urllib

def child(fileset):
  print 'Tervist loimest, kopeerin faili: ', fileset
  urllib.urlretrieve('http://ftp.aso.ee/pub/OpenBSD/4.6/amd64/' + fileset, fileset)

filesetid = ('bsd', 'base46.tgz', 'comp46.tgz', 'etc46.tgz', 'man46.tgz', 'misc46.tgz')

for fileset in filesetid:
  thread.start_new(child, (fileset,))

raw_input( )

kus

  • raw_input( ) - kui klaviatuurilt sisestust mitte oodata, siis jõuaks programmi täitmine lõpule enne kui lõimed on lõpetanud

Tulemusena töötab kokku protsessis seitse lõime

$ ps -aeLf | grep python | grep -v grep
UID        PID    PPID   LWP    C    NLWP  STIME  TTY      TIME      CMD
priit      1308   880    1308   0    7     15:06  pts/0    00:00:00  python loim-ftp.py
priit      1308   880    1309   0    7     15:06  pts/0    00:00:00  python loim-ftp.py
priit      1308   880    1310   0    7     15:06  pts/0    00:00:00  python loim-ftp.py
priit      1308   880    1311   0    7     15:06  pts/0    00:00:00  python loim-ftp.py
priit      1308   880    1312   0    7     15:06  pts/0    00:00:00  python loim-ftp.py
priit      1308   880    1313   0    7     15:06  pts/0    00:00:00  python loim-ftp.py
priit      1308   880    1314   0    7     15:06  pts/0    00:00:00  python loim-ftp.py

kust on näha, et kõigil ridadel on sama PID väärtus kuid erinevad LWP väärtused.

Käsurea argumentide kasutamine skriptis

sys.argv massiiv sisaldab programminime ja käsureal kasutatud argumentide väärtusi, skript

import sys

for i in sys.argv:
  print i

väljastab käivitamisel

$ python skript.py yks kaks kolm
ar.py
yks
kaks
kolm

Regulaaravaliste kasutamine

Skript esitab tekstifailist tunnusele vastavad read

import re

for rida in open ('tekstifail.txt'):
  matchobj = re.search('muster', rida)
  if matchobj:
    print rida.rstrip()

OOP

class nimed:
  def __init__(self, domeeninimi, omanik ):
    self.domeeninimi = domeeninimi
    self.omanik = omanik
    self.ttl = 86400

  def suurendattl(self, kordaja):
    self.ttl = self.ttl * kordaja

if __name__ == '__main__':

  # objektid moodustamine
  eesti = nimed(domeeninimi = 'eesti.ee', omanik = 'Calevipoeg')
  tartu = nimed(domeeninimi = 'tartu.ee', omanik = 'Dor Batt')

  # too objektidega  
  eesti.suurendattl(2)

  # tulemuste esitamine
  print eesti.omanik
  print (eesti.ttl)

Kasulikud lisamaterjalid