TypeVar, Genel Sınıflar ve Protocol
Yeniden kullanılabilir genel türler ve Protocol ile yapısal alt tipleme tanımlayın.
TypeVar, Genel Sınıflar ve Protocol, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
TypeVar Nedir
TypeVar, gerektiğinde kısıtlanabilen ve herhangi bir tür olabilen bir yer tutucu tür değişkeni bildirir. Genel işlevlerde ve sınıflarda kullanılır.
from typing import TypeVar
T = TypeVar("T")
def identity(value: T) -> T:
return value
print(identity(42)) # int
print(identity("hello")) # strGenel İşlevler
Hem parametre hem de dönüş türlerinde TypeVar kullanan bir işlev, mypy'nin dönüş türünü bağımsız değişkenin türünden çıkarmasını sağlar.
from typing import TypeVar
T = TypeVar("T")
def first(items: list[T]) -> T:
return items[0]
x: int = first([1, 2, 3]) # mypy knows x is int
s: str = first(["a","b","c"]) # mypy knows s is strKısıtlanmış TypeVar
Hangi türlerin kabul edilebileceğini sınırlandırmak için TypeVar ifadesine tür kısıtlamaları geçirin.
from typing import TypeVar
Numeric = TypeVar("Numeric", int, float)
def double(n: Numeric) -> Numeric:
return n * 2
print(double(5)) # 10
print(double(2.5)) # 5.0
# double("x") # mypy errorGenel Sınıflar
Bir tür değişkeniyle parametreleştirilmiş bir sınıf oluşturmak için Generic[T] sınıfından kalıtım alın.
from typing import Generic, TypeVar
T = TypeVar("T")
class Stack(Generic[T]):
def __init__(self) -> None:
self._items: list[T] = []
def push(self, item: T) -> None:
self._items.append(item)
def pop(self) -> T:
return self._items.pop()
stack: Stack[int] = Stack()
stack.push(1)
print(stack.pop()) # 1Birden Çok TypeVar
Bir sınıfı veya işlevi birbirinden bağımsız iki tür üzerinden parametreleştirmek için birden fazla TypeVar kullanın.
from typing import Generic, TypeVar
K = TypeVar("K")
V = TypeVar("V")
class Pair(Generic[K, V]):
def __init__(self, key: K, value: V) -> None:
self.key = key
self.value = value
p: Pair[str, int] = Pair("age", 30)
print(p.key, p.value) # age 30Protocol — Yapısal Alt Türleme
Protocol, açıkça kalıtım gerektirmeden, bir sınıfın sahip olması gereken yöntem ve öznitelikleri temel alarak bir arayüz tanımlar ("ördek tiplemesi, tür denetimli").
from typing import Protocol
class Drawable(Protocol):
def draw(self) -> None: ...
def render(obj: Drawable) -> None:
obj.draw()
class Circle:
def draw(self) -> None:
print("Drawing circle")
render(Circle()) # works — Circle satisfies Drawableruntime_checkable ile Protocol
Çalışma zamanında isinstance() denetimlerini etkinleştirmek için bir Protocol'e @runtime_checkable ekleyin.
from typing import Protocol, runtime_checkable
@runtime_checkable
class Closeable(Protocol):
def close(self) -> None: ...
class File:
def close(self) -> None: print("closed")
print(isinstance(File(), Closeable)) # TrueProtocol ve ABC Karşılaştırması
ABC'ler açıkça kalıtım gerektirir (class Dog(Animal)). Protocol'ler ise yapısal eşleştirmeyle çalışır; bir sınıf doğru yöntemlere sahipse kalıtımdan bağımsız olarak protokolü karşılar.
from typing import Protocol
from abc import ABC, abstractmethod
# ABC: nominal typing
class Printable(ABC):
@abstractmethod
def display(self) -> None: ...
# Protocol: structural typing
class Displayable(Protocol):
def display(self) -> None: ...bound ile TypeVar
TypeVar("T", bound=BaseClass), T'yi BaseClass veya onun alt sınıflarından biriyle sınırlar.
from typing import TypeVar
class Animal:
def speak(self) -> str: return "..."
A = TypeVar("A", bound=Animal)
def make_speak(animal: A) -> str:
return animal.speak()Genel Tür Takma Adı — Python 3.12
Python 3.12, tür takma adlarını temiz bir biçimde tanımlamak için type ifadesini ve TypeVar içe aktarmadan genel türleri kullanmak için class Foo[T] söz dizimini sunar.
# Python 3.12+
type Vector = list[float]
type Matrix = list[Vector]
class Stack[T]:
def __init__(self) -> None: self._items: list[T] = []
def push(self, item: T) -> None: self._items.append(item)
def pop(self) -> T: return self._items.pop()Self Türü
Self (Python 3.11 ve sonrasında typing modülünden), geçerli sınıfı döndüren yöntemleri açıklar; akıcı arayüzlerde ve alt sınıflarda kullanışlıdır.
from typing import Self
class Builder:
def __init__(self) -> None:
self.parts: list[str] = []
def add(self, part: str) -> Self:
self.parts.append(part)
return self
b = Builder().add("a").add("b")
print(b.parts) # ["a", "b"]Hızlı Kontrol
Python tür yazımında Protocol ile ABC arasındaki temel fark nedir?
Özet
TypeVar, genel işlevler ve sınıflar için tür yer tutucuları oluşturur. Generic[T], sınıfları parametreleştirir. Protocol, kalıtım olmadan yapısal alt türlemeyi etkinleştirir. Kabul edilebilir türleri sınırlandırmak için TypeVar üzerinde bound= veya tür kısıtlamaları kullanın.
Sıkça Sorulan Sorular
“TypeVar, Genel Sınıflar ve Protocol” dersi ücretsiz mi?
Evet — “TypeVar, Genel Sınıflar ve Protocol” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“TypeVar, Genel Sınıflar ve Protocol” dersinde ne öğreneceğim?
Yeniden kullanılabilir genel türler ve Protocol ile yapısal alt tipleme tanımlayın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“TypeVar, Genel Sınıflar ve Protocol” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Temel Tür Ek Açıklamaları
- Karmaşık Türler: List, Dict, Optional, Union
- TypeVar, Genel Sınıflar ve Protocol
- mypy Çalıştırma ve Tür Hatalarını Düzeltme