क्या क्लास विधि से शुरू होने पर कक्षा में __init__
को कॉल करने से बचने का कोई तरीका है?पायथन: प्रारंभकर्ता को कॉल किए बिना कक्षा उदाहरण बनाना
मैं पाइथन में एक केस और विराम चिह्न असंवेदनशील स्ट्रिंग क्लास बनाने की कोशिश कर रहा हूं जो कुशल तुलनात्मक उद्देश्यों के लिए उपयोग किया जाता है लेकिन __init__
पर कॉल किए बिना एक नया उदाहरण बनाने में परेशानी हो रही है।
>>> class String:
def __init__(self, string):
self.__string = tuple(string.split())
self.__simple = tuple(self.__simple())
def __simple(self):
letter = lambda s: ''.join(filter(lambda s: 'a' <= s <= 'z', s))
return filter(bool, map(letter, map(str.lower, self.__string)))
def __eq__(self, other):
assert isinstance(other, String)
return self.__simple == other.__simple
def __getitem__(self, key):
assert isinstance(key, slice)
string = String()
string.__string = self.__string[key]
string.__simple = self.__simple[key]
return string
def __iter__(self):
return iter(self.__string)
>>> String('Hello, world!')[1:]
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
String('Hello, world!')[1:]
File "<pyshell#1>", line 17, in __getitem__
string = String()
TypeError: __init__() takes exactly 2 positional arguments (1 given)
>>>
मैं स्लाइस के साथ नई वस्तु प्रारंभ करने के साथ string = String(); string.__string = self.__string[key]; string.__simple = self.__simple[key]
क्या बदलना चाहिए?
संपादित करें:
के रूप में जवाब के नीचे लिखा से प्रेरित, प्रारंभकर्ता जल्दी से कोई तर्क के लिए जाँच करने के लिए संपादित किया गया है।
def __init__(self, string=None):
if string is None:
self.__string = self.__simple =()
else:
self.__string = tuple(string.split())
self.__simple = tuple(self.__simple())
संभावित डुप्लिकेट [क्या \ _ \ _ init \ _ \ _?] (Http: // stackoverflow) कॉल किए बिना कक्षा को तुरंत चालू करने का कोई तरीका है।कॉम/प्रश्न/6383914/एक-तरफा-से-तत्काल-ए-क्लास-बिना-कॉलिंग-इनिट) – kay