Python Academy · पाठ

TypeVar, जेनेरिक क्लास और Protocol

पुनः उपयोग योग्य जेनेरिक प्रकार परिभाषित करें और Protocol से संरचनात्मक सबटाइपिंग करें।

पाठ 3, कुल 4 में से13 चरण

TypeVar, जेनेरिक क्लास और Protocol, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

TypeVar क्या है

TypeVar एक टाइप चर घोषित करता है—ऐसा स्थानधारक जो कोई भी प्रकार हो सकता है और आवश्यकता पड़ने पर सीमित किया जा सकता है। इसका उपयोग जेनेरिक फ़ंक्शन और क्लास में किया जाता है।

from typing import TypeVar

T = TypeVar("T")

def identity(value: T) -> T:
    return value

print(identity(42))      # int
print(identity("hello")) # str

जेनेरिक फ़ंक्शन

पैरामीटर और रिटर्न, दोनों के प्रकारों में TypeVar का उपयोग करने पर mypy आर्ग्युमेंट के प्रकार से रिटर्न प्रकार का अनुमान लगा सकता है।

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 str

सीमित TypeVar

स्वीकार्य प्रकारों को सीमित करने के लिए TypeVar को प्रकार संबंधी प्रतिबंध दें।

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 error

जेनेरिक क्लास

किसी टाइप चर द्वारा पैरामीटरित क्लास बनाने के लिए Generic[T] से इनहेरिट करें।

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())   # 1

एकाधिक TypeVar

किसी क्लास या फ़ंक्शन को दो स्वतंत्र प्रकारों के आधार पर पैरामीटरित करने के लिए कई TypeVar का उपयोग करें।

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 30

Protocol — संरचनात्मक उपप्रकारण

Protocol उन मेथड और एट्रिब्यूट के आधार पर इंटरफ़ेस परिभाषित करता है जो किसी क्लास में होने चाहिए; इसके लिए स्पष्ट इनहेरिटेंस आवश्यक नहीं है ("डक टाइपिंग, टाइप-जाँच सहित")।

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 Drawable

runtime_checkable के साथ Protocol

रनटाइम पर isinstance() जाँच सक्षम करने के लिए किसी Protocol में @runtime_checkable जोड़ें।

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))   # True

Protocol बनाम ABC

ABC के लिए स्पष्ट इनहेरिटेंस आवश्यक है (class Dog(Animal))। Protocol संरचनात्मक मिलान के आधार पर काम करते हैं—यदि किसी क्लास में सही मेथड हैं, तो इनहेरिटेंस की परवाह किए बिना वह प्रोटोकॉल को संतुष्ट करती है।

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 के साथ TypeVar

TypeVar("T", bound=BaseClass) T को BaseClass या उसकी किसी भी सबक्लास तक सीमित करता है।

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()

जेनेरिक एलियस — पाइथन 3.12

पाइथन 3.12 में स्पष्ट टाइप एलियस के लिए type स्टेटमेंट और TypeVar इम्पोर्ट किए बिना जेनेरिक के लिए class Foo[T] सिंटैक्स प्रस्तुत किया गया है।

# 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 प्रकार

Self (3.11+ में typing से) उन मेथड का एनोटेशन करता है जो वर्तमान क्लास लौटाते हैं। यह फ़्लुएंट इंटरफ़ेस और सबक्लास में उपयोगी है।

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"]

त्वरित जाँच

पाइथन टाइपिंग में Protocol और ABC के बीच मुख्य अंतर क्या है?

पुनरावलोकन

TypeVar जेनेरिक फ़ंक्शन और क्लास के लिए टाइप स्थानधारक बनाता है। Generic[T] क्लास को पैरामीटरित करता है। Protocol इनहेरिटेंस के बिना संरचनात्मक उपप्रकारण सक्षम करता है। स्वीकार्य प्रकारों को सीमित करने के लिए TypeVar पर bound= या प्रकार संबंधी प्रतिबंधों का उपयोग करें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
76
पाठ
320

अक्सर पूछे जाने वाले प्रश्न

क्या “TypeVar, जेनेरिक क्लास और Protocol” पाठ निःशुल्क है?

हाँ—“TypeVar, जेनेरिक क्लास और Protocol” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“TypeVar, जेनेरिक क्लास और Protocol” में मैं क्या सीखूँगा?

पुनः उपयोग योग्य जेनेरिक प्रकार परिभाषित करें और Protocol से संरचनात्मक सबटाइपिंग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“TypeVar, जेनेरिक क्लास और Protocol” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. प्रकार एनोटेशन की मूल बातें
  2. जटिल प्रकार: List, Dict, Optional, Union
  3. TypeVar, जेनेरिक क्लास और Protocol
  4. mypy चलाना और प्रकार त्रुटियाँ ठीक करना
← Python Academy पर वापस जाएँ