# Python-luokkien ja -objektien luominen

Python-luokat ovat kuin **rakennuspiirustuksia tai malleja**. Niiden avulla voit kirjoittaa uudelleenkäytettävää koodia luokkien attribuuttien ja metodien muodossa.

## Mitä ovat Python-luokat?

Luokka on **abstrakti käsite**, joka määrittelee objektien attribuutit ja metodit. Python-luokka toimii mallina konkreettisten objektien luomiselle, jotka ovat luokan instansseja. Esimerkiksi `Car` voisi määritellä attribuutteja, kuten väri ja merkki, sekä metodeja, kuten `__drive__` tai `__brake__`.

Vaikka jokaisella luokan objektilla voi olla ainutlaatuiset attribuuttiarvot, saman luokan objektit **jakavat menetelmät ja perusrakenteen muiden** luokan **instanssien kanssa**. Esimerkiksi luokan `Car` objekti `my_car` voidaan luoda värillä `__red__` ja merkillä `__Toyota__`, mutta menetelmät `__drive__` ja `__brake__` siirretään automaattisesti instanssiin.

## Python-luokkien luominen

Pythonissa määritellään luokat avainsanalla `class`.

```python
class MyClass:
    # Constructor method called when creating an object
    def __init__(self, attribute1, attribute2):
        self.attribute1 = attribute1
        self.attribute2 = attribute2
    
    # Method defined within the class
    def my_method(self):
        return f"Attribute 1: {self.attribute1}, Attribute 2: {self.attribute2}"
```

Yllä oleva koodi määrittelee luokan nimeltä `MyClass`. Sillä on **konstruktori** `__init__`, joka kutsutaan objektin luomisen yhteydessä ja alustaa kaksi attribuuttia: `attribute1` ja `attribute2`. Menetelmä `my_method` palauttaa muotoillun merkkijonon, joka sisältää näiden attribuuttien arvot.

Jos haluat johtaa objektin tästä luokasta, käytä luokkanimeä suluissa:

```python
object1 = MyClass("Value 1", "Value 2")
# Calling a method of the object
result = object1.my_method()
```

## Esimerkkejä Python-luokkien käytöstä

Python-luokat voivat luoda monimutkaisia järjestelmiä ja suhteita eri entiteettien välille. Seuraavissa osioissa näytämme, miten Python-luokkia käytetään.

### `__str()__` toiminto

Pythonin `__str__()` on erityinen menetelmä, jonka voit määritellä Python-luokissa. Kun se on toteutettu, se palauttaa merkkijonon, joka edustaa **käyttäjäystävällistä esitystä objektista**. Voit käyttää `str()` suoraan objektissa tai yhdistää sen `print()`.

```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __str__(self):
        return f"Name: {self.name}, Age: {self.age}"
person1 = Person("Alice", 30)
print(person1) # Output: Name: Alice, Age: 30
```

Yllä olevassa koodissa `__str__()` `Person` okassa luo **muotoillun merkkijonon**, joka näyttää henkilön nimen ja iän. Kun `print(person1)` suoritetaan, se kutsuu automaattisesti `person1` -objektin `__str__()` menetelmän ja tulostaa menetelmän palauttaman merkkijonon.

### Menetelmien määritteleminen Python-luokissa

Pythonissa voit määritellä **luokassa metodeja**, joilla suoritetaan operaatioita luokan objekteille. Näitä metodeja voivat sitten kutsua luodut objektit.

```python
class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width
    
    def area(self):
        return self.length * self.width
    def perimeter(self):
        return 2 * (self.length + self.width)
# Creating an object of the class
my_rectangle = Rectangle(5, 10)
# Calling methods of the object
area = my_rectangle.area()
perimeter = my_rectangle.perimeter()
# Printing the calculated values
print("Area =", area) # Output: Area = 50
print("Perimeter =", perimeter) # Output: Perimeter = 30
```

Python-esimerkissä määritellään luokka `Rectangle` kahdella menetelmällä `area()` ja `perimeter()`, jotka laskevat suorakulmion pinta-alan ja kehän objektin alustuksen yhteydessä annettujen pituuden ja leveyden perusteella. Pythonissa `self` luokkametodissa toimii **viittauksena objektiin**, johon menetelmää parhaillaan sovelletaan.

Objekti `my_rectangle` luodaan pituudella 5 ja leveydellä 10. Sitten kutsumme tämän objektin menetelmät `area()` ja `perimeter()` laskeaksemme vastaavat arvot.

### Objektien ominaisuuksien muuttaminen

`.` voidaan käyttää **objektin tiettyjen attribuuttien** käyttämiseen ja niiden arvojen päivittämiseen. Voit määrittää uusia arvoja suoraan attribuutille.

```python
person1.name = "Sarah"
person1.age = 35
```

Avainsanaa `del` käytetään objektin ominaisuuksien poistamiseen.

```python
del person1.name
```

Huomio Muista, että instanssimuuttujat eroavat [Python-luokkamuuttujista](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/python-luokan-muuttujat/). Luokkamuuttujat määritellään **konstruktorin ulkopuolella**, ja niitä voidaan muuttaa vain luokkanimen avulla.


This is a markdown version of: [https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/python-luokat/](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/python-luokat/) for AI/LLM consumption.