Python instance methods

class Orders():

    def __init__(self):
        self.buyerInfo()
        self.orderList = list()

    def buyerInfo(self):
        self.name = input("İsim : ")
        self.surname = input("Soyisim : ")
        self.number = input("Tel No : ")

    def order(self):
        pass

buyerInfo instance method unu çağırınca sürekli içindeki inputları tekrarlıyor.Bu neden oluyor.Bunu nasıl engelleyebilirim?

Cunku buyerInfo metodu input fonksiyonunu cagiriyor.

buyerInfo'daki bu uc cagriyi silebilirsin.

Ben bunları parametre olarak değilde kullanıcıya sorarak yapmak istedim?

İkisini de aynı anda yapabilirsiniz. Sınıf örneği parametrelerine input fonksiyonu atanabilir.

class Orders:
    order_list = []

    def __init__(
            self,
            name: str = input("name: "),
            surname: str = input("surname: "),
            number: int = input("number: ")
    ):
        self.name = name
        self.surname = surname
        self.number = number
        self.order_list.append([self.name, self.surname, self.number])

    def buyer_info(self):
        print(self.name, self.surname, self.number)

    def order(self):
        pass


# Bu örnekte parametrelerdeki input fonksiyonları çalışmaz.
order1 = Orders(name="Ali", surname="Gün", number=0)
# Bu örnekte parametrelerdeki input fonksiyonları çalışır.
order2 = Orders()

order1.buyer_info()
order2.buyer_info()

Kodunda parametre goremedim. Kullaniciya soran 3 cagri var.

Evet olmaması için bunları yaptım.Demek sınıf örneği parametrelerine input fonksiyonu atanabiliyor.Çok teşekkür ederim.Yeni bişey öğrendim sayenizde.

Bir fonksiyonun parametresine her tip veri atanabilir.

def __init__(
        self,
        name: str = input("name: "),
        surname: str = input("surname: "),
        number: int = input("number: ")
):

Kodunuzda “init” methodunun parametrelerine çalışma esnasında bir defa belirlenecek kalıcı bir öntanımlı değer atadığınızın farkında mısınız? Yani “input” fonksiyonları “order2 = Orders()” dendiğinde değil “Orders” sınıfı tanımlanırken çalışıyor.
Orders” sınıfını parametresiz bir şekilde her çağırışımızda nitelikleri aynı değerlere sahip örnekler dönecek.

Evet farkındayım, order1 = Orders yaptığınızda order1 değişkenini sınıfa eşitlemiş olursunuz ve inputlar çalışır ama sınıftan bir örnek oluşturulmaz. Ayrıca input fonksiyonları order2 = Orders() dendiğinde de çalışıyor. Yani her iki durumda da inputlar çalışıyor ancak Orders() yaptığımız zaman sınıftan bir örnek oluşur…

order1 = Orders
print(order1.order_list) # Boş liste
order2 = order1()
print(order1.order_list)

Yani burada Orders sınıfını order1 isimli bir değişkene eşitlemeye zaten gerek yok. Direk örnek oluşturmak gerekiyor.

Ha şöyle de yapılabilir elbette:

    def __init__(
            self,
            name: str = "",
            surname: str = "",
            number: int = ""
    ):

Sonra da şöyle örnekler oluşturulabilir…

order1 = Orders(input("name: "), input("surname: "), input("number: "))

Sanırım aramızda bir iletişimsizlik oldu ancak şunu söyleyeyim, ben Python3.7.4’te bu kodu çalıştırdığımda:

class Orders():   #SİPARİŞ
    buyers_list = []
    code_product = {1:"Elma",
                    2:"Armut",
                    3:"Nar",
                    4:"Karpuz",
                    5:"Domates",
                    6:"Salatalık",
                    7:"Biber"}
    def __init__(self,
                 name: str = input("İsim : "),
                 surname: str = input("Soyisim : "),
                 number: int = input("Tel No : ")):
        self.name = name
        self.surname = surname
        self.number = number

etkileşimli kabuktaki çıktılar eksiksiz bir şekilde bu oluyor:

İsim : Ekrem
Soyisim : Dinçel
Tel No : 123
>>> örnek = Orders()
>>> örnek.name
Ekrem
>>> örnek.surname
Dinçel
>>> Orders.__init__.__defaults__
('Ekrem', 'Dinçel', '123')

Demek istediğim bu. Umarım anlaşılır olmuştur.

Evet farkındayım, order1 = Orders yaptığınızda order1 değişkenini sınıfa eşitlemiş olursunuz ve inputlar çalışır ama sınıftan bir örnek oluşturulmaz.

Değer atama işlemi yapıldığında input lar çalışmaz. Sadece Orders.__init__ fonksiyonu tanımlanırken input lar çalışıyor.

Ayrıca input fonksiyonları order2 = Orders() dendiğinde de çalışıyor.

Demek istediğim de bunun yanlış olduğu. Bir örnekleme işlemi yapıldığına input fonksiyonu çalışmıyor, daha önceden çalışan input fonksiyonlarının döndürdüğü değerler kullanılıyor.

1 Like

Doğru haklısınız, yanılmışım. Şöyle düzelttim:

#!/usr/bin/env python3.8
# -*- coding: utf-8 -*-


def get_int():
    while not str((number := input("number: "))).isnumeric():
        continue
    else:
        return int(number)
        

class Orders:
    order_list = []

    def __init__(
        self,
        name: str = "",
        surname: str = "",
        number: int = 0
    ):
        if not name:
            self.__name = input("name: ")
        else:
            self.__name = name
        if not surname:
            self.__surname = input("surname: ")
        else:
            self.__surname = surname
        if not number:
            self.__number = get_int()
        else:
            if number.isnumeric():   
                self.__number = number
            else:
                self.__number = get_int()
        self.order_list.append([self.__name, self.__surname, self.__number])
        
    @property
    def name(self):
        return self.__name
        
    @name.setter
    def name(self, new):
        for i in range(len(self.order_list)):
            if self.order_list[i][0] == self.__name:
                self.order_list[i][0] = new
                self.__name = new
        
    @name.deleter
    def name(self):
        del self.__name

    @property
    def surname(self):
        return self.__surname
        
    @surname.setter
    def surname(self, new):
        for i in range(len(self.order_list)):
            if self.order_list[i][1] == self.__surname:
                self.order_list[i][1] = new
                self.__surname = new
        
    @surname.deleter
    def surname(self):
        del self.__surname
        
    @property
    def number(self):
        return self.__number
        
    @number.setter
    def number(self, new):
        if isinstance(new, int):
            for i in range(len(self.order_list)):
                if self.order_list[i][2] == self.__number:
                    self.order_list[i][2] = new
                    self.__number = new
        else:
            new = get_int()
            for i in range(len(self.order_list)):
                if self.order_list[i][2] == self.__number:
                    self.order_list[i][2] = new
                    self.__number = new
        
    @number.deleter
    def number(self):
        del self.__number
        
    def buyer_info(self):
        print(self.__name, self.__surname, self.__number)

    def order(self):
        pass


order1 = Orders(name="hasan", surname="veli", number="3")
order1.name = "Ali"
order1.surname = "Gün"
order1.number = 15

order2 = Orders(name="Ahmet", surname="Yılmaz")

print(order2.order_list)
1 Like