Python Csv dosyasından class oluşturan programda anlamadığım self parametresi

NecoTheGrim

Kilopat
Katılım
29 Kasım 2016
Mesajlar
118
Yer
İstanbul/Güngören
Daha fazla  
Cinsiyet
Erkek
Meslek
Bilgisayar mühendisliği öğrencisi
Python:
import csv
#Class method ve csv dosyasını okutup instance yaratma:
class Item:

    objects=[] #instance depolamak için boş bir class variable olan objects list tanımladık.

    def __init__(self,name: str,price: float,quantity=0):

        assert price>=0, f"Price {price} is not greater or equal to zero"
        assert quantity>=0, f"Quantity {quantity} is not greater or equal to zero"

        self.name=name
        self.price=price
        self.quantity=quantity

        Item.objects.append(self) #classmethod içinde her instance tanımlandığında __init__ fonksiyonu çalışacak ve instancelar append ile depolanacak.

    @classmethod
    def create_instance_with_csv(cls): #parametre olarak classın kendisini yani Item classını yollamamız gerekiyor. cls, Item classını tutuyor.

        with open("items.csv", "r") as folder: #burada items.csv dosyasını okutuyoruz ve adını kendimiz koyduğumuz folder'a tanımlıyoruz.("r" = read demek)
            reader = csv.DictReader(folder) #csv dosyasını tutan folder'ı csv.DictReader(folder) ile dicte çevirdik ve reader'a eşitledik.
            item_list_with_dict = list(reader) #reader'ı liste çevirdik. item_list_with_dict, dict depolamış bir list oldu. her indexte dict var.

        for i in item_list_with_dict: #i, list içindeki her bir dicti teker teker tutuyor.
            cls(                                                             #cls(name,price,quantity) şeklinde Item classına bağlı instancelar oluşuyor ve her defasında __init__ çalışıyor.
                 name = i.get("name"),                          #i'nin tuttuğu dictteki valueları, (name,price,quantity)'e atayıp classa parametre olarak yolluyoruz.
                 price = float(i.get("price")),                   #csv dosyasındaki valuelar string olduğundan price'ı float, quantity'i integer yapıyoruz.
                 quantity = int(i.get("quantity"))
            )


    def __repr__(self):
        return f"Products('{self.name}', '{self.price}', '{self.quantity}')"

Item.create_instance_with_csv() #Bu method ile class içinde, csv dosyasındaki valueları attribute olarak kullanan instancelar oluşturuyoruz.
#Item classını parametre olarak classmethoda yolluyoruz.
print(Item.objects) #class'taki liste depolanmış bilgileri basıyoruz. __repr__ methodu önceki bölümde işlendi. ona bak.

Merhabalar. "name, price, quantity" sütünlarına sahip bir Csv dosyasındaki değerleri attribute'a çevirip bunlardan instance oluşturan bir Python programı yazdım.
Classmethod metodunda her instance oluştuğunda __init__ fonksiyonu çalışıyor ama bir sorum olucak. Normalde __init__ fonksiyonuna parametre olarak bir self parametresi yollamamız gerekiyor. Örnek olarak "item1 = Item("phone", 100 , 5)" instance'ı oluştururken item1, self parametresi iken phone, 100, 5 ise sırasıyla name, price ve quantity parametreleri oluyor. Ama classmethod metoduna baktığınızda ise üstteki yaptığım örnekteki gibi kendimiz instance oluşturmuyoruz. Bu instance'lar classmethod metodunda oluşturuluyor ve her oluşturulduklarında __init__ fonksiyonu çalışıyor ama sorun şu ki üstteki verdiğim örnekteki gibi yollayabileceğimiz bir self parametresi yok. "item1" gibi kendimiz instance da oluşturmuyoruz. Nasıl oluyor da self parametresi yollanmadan __init__ fonksiyonu çalışabiliyor? Yardım ederseniz çok sevinirim.
 
Bunu sağlayan @classmethod decorator'u, biraz araştırsan detaylı bilgi bulabilirsin.
Yine de arka planda ne döndüğüne dair bir örnek vereyim.

Item.create_instance_with_csv() bu metodu çağırdığında arka planda create_instance_with_csv(Item, *args) olarak işlem görüyor. Yani sınıfa bir referans ve argümanlar şeklinde. Aradaki fark ise self ile nesne örneğinin bir referansına erişirsin, cls ile sınıfın bir referansına.
 
Bunu sağlayan @classmethod decorator'u, biraz araştırsan detaylı bilgi bulabilirsin.
Yine de arka planda ne döndüğüne dair bir örnek vereyim.

Item.create_instance_with_csv() bu metodu çağırdığında arka planda create_instance_with_csv(Item, *args) olarak işlem görüyor. Yani sınıfa bir referans ve argümanlar şeklinde. Aradaki fark ise self ile nesne örneğinin bir referansına erişirsin, cls ile sınıfın bir referansına.
Az çok anladım gibi ama decorator' a detaylı bir şeklide bakmam lazım. Bi de *args, **kwargs'ları unutmuşum. Daha yeni bir alan seçtiğim için tekrardan Python çalışıyorum. OOP temellerinden sonra hepsine bakacağım. Teşekkür ederim <3
 

Technopat Haberler

Geri
Yukarı