एक अजगर वर्णनकर्ता उदाहरण (टाइपेडप्रोपर्टी) को समझना - पायथन, कक्षा, वर्णनकर्ता

यहां एक पाइथन पुस्तक में पाए गए कुछ कोड का थोड़ा संशोधित संस्करण दिया गया है:

class TypedProperty(object):
def __init__(self,name,type,default=None):
self.name = "_" + name
self.type = type
self.default = default if default else type()
def __get__(self,instance,cls):
return getattr(instance,self.name,self.default)
def __set__(self,instance,value):
if not isinstance(value,self.type):
raise TypeError("Must be a %s" % self.type)
setattr(instance,self.name,value)

class Foo(object):
name = TypedProperty("name",str)
num = TypedProperty("num",int,42)

f = Foo()
f.name = "blah"

मेरा सवाल: हम एफ में गुण क्यों बना रहे हैं? उपर्युक्त कोड में, टाइपेडप्रोपर्टी इस प्रकार लिखा गया है कि f.name = "blah" उदाहरण f में विशेषता "_name" बनाता है।

मूल्यों को TypedProperty श्रेणी के गुणों के रूप में क्यों नहीं बचाएं? मेरे मन में यह है:

class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ

def __get__(self, instance, owner):
return self.value

def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val

क्या यह एक मनमाना डिजाइन निर्णय है?

उत्तर:

जवाब के लिए 2 № 1

सब कक्षा के उदाहरण वर्णनकर्ता के समान उदाहरण साझा करेंगे (उदा। TypedProperty)। तो, यदि आप मूल्य को स्टोर करते हैं TypedProperty, तो सभी के उदाहरण Foo के लिए एक ही मूल्य होगा name तथा num मान। ये है आमतौर पर वर्णनकर्ताओं के लिए वांछनीय (या अपेक्षित) नहीं।

जैसे यदि आप निम्न स्क्रिप्ट चलाते हैं:

class TypedProperty2(object):
def __init__(self, val, typ):
if not isinstance(val, typ):
raise TypeError()
self.value = val
self.typ = typ

def __get__(self, instance, owner):
return self.value

def __set__(self, instance, val):
if not isinstance(val, self.typ):
raise TypeError()
self.value = val


class Foo(object):
name = TypedProperty2("name", str)

f1 = Foo()
f1.name = "blah"

f2 = Foo()
print(f2.name)
f2.name = "bar"

print(f1.name)

आप निम्नलिखित आउटपुट देखेंगे:

blah
bar

इसलिए हम शुरुआत में देख सकते हैं f2 था f1का नाम बदलने के बाद और फिर नाम f2, f1 उठाया f2"नाम


संबंधित सवाल
सबसे लोकप्रिय