TypeVar, जेनेरिक क्लास और Protocol
पुनः उपयोग योग्य जेनेरिक प्रकार परिभाषित करें और Protocol से संरचनात्मक सबटाइपिंग करें।
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 30Protocol — संरचनात्मक उपप्रकारण
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 Drawableruntime_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)) # TrueProtocol बनाम 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 पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- प्रकार एनोटेशन की मूल बातें
- जटिल प्रकार: List, Dict, Optional, Union
- TypeVar, जेनेरिक क्लास और Protocol
- mypy चलाना और प्रकार त्रुटियाँ ठीक करना