Python3.7 tip belirtimindeki yenilikler?

Aşağıdaki kullanımda from_string fonksiyonu bir c sınıfımı return ediyor, nasıl bir kullanımdır, yani artık bir sınıf türünü bir değişken veya fonksiyona türü budur diye belirtebiliyor muyuz?Bu konuda bilgisi olan var mıdır?

class C:
    @classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...
1 Beğeni

Bu özellik 3.7’den önce geldi diye biliyorum. Python’daki yeni seçeneksel tip belirtimi desteği bu. Bu destek sayesinde C, Java, vb. dillerdeki gibi fonksiyon parametrelerinin tiplerini ve fonksiyonun ne tür bir nesne döndürdüğünü belirtebiliyoruz.

Haklısınız Hocam, 3.6 da gelmişti, hatta ilk buradaki belgelerden okudum ancak merakım şu bildiğim tip belirtiminde belli başlı veri tipleri var,bool,int, str, list,tuple vs. ancak yukarıdaki örnekteki gibi bir sınıf oluşturup bu sınıftan dönen değeri direk nasıl tip olarak belirtebiliyoruz onu anlayamadım ?

Hocam ben sizi pek anlayamadım.Aslında 3.7 de kullanmadım.Bu özelliği kendi pcmde denedim.Syntax vermedi.Yani 3.5.2 de de bu özellik var.

int , str vs , list, vs ler zaten class değil midir.Hatta funclar bile class tır.

class B:
    @classmethod
    def from_string(cls, source: str) -> B:
        ...

B de bir class değil midir.İsterseniz idle enişteye sorun.Bu arada bu konunun bir takipçisi de benim .

Kolay gelsin :slight_smile:

Tip belirtimiyle alakalı bir örnek paylaşayım.

class A:
    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y

    def __add__(self, other: 'A'):
        return A(self.x + other.x, self.y + other.y)

    def __sub__(self, other: 'A'):
        return A(self.x - other.x, self.y - other.y)


A1 = A(x=2, y=3)
A2 = A(x=4, y=5)
A3 = A1.__add__(other=A2)

print(A3.x, A3.y)


def square(a: A):
    return a.x ** 2, a.y ** 2


print(*square(a=A(x=10, y=10)))
1 Beğeni

@dildeolupbiten tamam hocam bu örnekle şimdi anladım ve bir yaşıma daha girdim :smiley: sınıfı parametre olarak verirken onun tipi bu sınıftır diye belirtebiliyoruz.

İlgilenen herkese çok teşekkür ederim.

1 Beğeni

__add__ ve __sub__ metodlarında other parametrelerine verdiğiniz classlar tırnaksız olması gerekmiyor mu?

Hayır. Class’ın içindeki herhangi bir fonksiyonun parametresine Class’ın kendisini atadığımızda, onu tırnak içerisine alıyoruz. Eğer tırnak içerisine almazsak bir NameError hatası yükseltilir.

NameError: name 'A' is not defined
1 Beğeni

@hasser

Yalnız Python3.7’de geçerli olan yeni bir özellik var. class içindeki metodun parametresine class’ın kendisini tırnaksız yazabiliriz ama şu şekilde bir ekleme yaparak:

from __future__ import annotations


class A:
    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y

    def __add__(self, other: A):
        return A(self.x + other.x, self.y + other.y)

    def __sub__(self, other: A):
        return A(self.x - other.x, self.y - other.y)


A1 = A(x=2, y=3)
A2 = A(x=4, y=5)
A3 = A1.__add__(other=A2)

print(A3.x, A3.y)


def square(a: A):
    return a.x ** 2, a.y ** 2


print(*square(a=A(x=10, y=10)))
1 Beğeni