এই শ্রেণি বিবেচনা করুন:
class foo(object):
pass
ডিফল্ট স্ট্রিংয়ের উপস্থাপনাটি এরকম কিছু দেখায়:
>>> str(foo)
"<class '__main__.foo'>"
আমি কীভাবে এই প্রদর্শনকে একটি কাস্টম স্ট্রিং তৈরি করতে পারি?
এই শ্রেণি বিবেচনা করুন:
class foo(object):
pass
ডিফল্ট স্ট্রিংয়ের উপস্থাপনাটি এরকম কিছু দেখায়:
>>> str(foo)
"<class '__main__.foo'>"
আমি কীভাবে এই প্রদর্শনকে একটি কাস্টম স্ট্রিং তৈরি করতে পারি?
উত্তর:
প্রয়োগ করুন __str__()
বা __repr__()
শ্রেণীর মেটাগ্লাসে।
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
__str__
আপনি যদি পঠনযোগ্য স্ট্রিংফিকেশন বলতে চান তবে ব্যবহার করুন , __repr__
দ্ব্যর্থহীন উপস্থাপনার জন্য ব্যবহার করুন ।
_representation
বর্গ শরীর থেকে এবং return self._representation
এ __repr__()
ক্লাসের অধীনে একটি ক্লাস পদ্ধতি।
__repr__
প্রতিনিধিত্ব করতে ডিফল্টটি ব্যবহার করতে চান না C
। _representation
সদস্য থাকার বিকল্প হ'ল একটি মেটাক্লাস ফ্যাক্টরি তৈরি করা যা যথাযথভাবে একটি মেটাক্লাস উত্পাদন করে __repr__
(আপনি যদি এটি ব্যবহার করছেন তবে এটি দুর্দান্ত হতে পারে)।
class foo(object):
def __str__(self):
return "representation"
def __unicode__(self):
return u"representation"
instances
ক্লাসের জন্য স্ট্রিং প্রতিনিধিত্ব পরিবর্তন করে , ক্লাসের জন্য নয়।
যদি আপনাকে প্রথমটির মধ্যে বেছে নিতে হয় __repr__
বা এটির __str__
জন্য যেতে হয়, যেমন ডিফল্ট প্রয়োগকারী __str__
কলগুলি __repr__
যখন এটি সংজ্ঞায়িত করা হয়নি।
কাস্টম ভেক্টর 3 উদাহরণ:
class Vector3(object):
def __init__(self, args):
self.x = args[0]
self.y = args[1]
self.z = args[2]
def __repr__(self):
return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z)
def __str__(self):
return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z)
এই উদাহরণে, repr
আবার একটি স্ট্রিং ফেরত দেয় যা সরাসরি গ্রাস / সম্পাদিত হতে পারে, তবে str
ডিবাগ আউটপুট হিসাবে এটি আরও কার্যকর ।
v = Vector3([1,2,3])
print repr(v) #Vector3([1,2,3])
print str(v) #x:1, y:2, z:3
__repr__
বনাম সম্পর্কে আপনার মতামতটি __str__
সঠিক হলেও এটি প্রকৃত প্রশ্নের উত্তর দেয় না, যা শ্রেণিক-বস্তু সম্পর্কিত, উদাহরণ নয়।
Ignacio Vazquez-Abram 'এর অনুমোদিত উত্তরটি বেশ সঠিক। এটি অবশ্য পাইথন 2 প্রজন্মের। এখনকার পাইথন 3 এর জন্য একটি আপডেট হবে:
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object, metaclass=MC):
pass
print(C)
আপনি যদি কোডটি চান যা পাইথন 2 এবং পাইথন 3 উভয় জুড়ে চলেছে, ছয়টি মডিউলটি আপনি কভার করেছেন:
from __future__ import print_function
from six import with_metaclass
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(with_metaclass(MC)):
pass
print(C)
শেষ অবধি, আপনার যদি একটি ক্লাস থাকে যা আপনি একটি কাস্টম স্ট্যাটিক রেপ করতে চান, তবে উপরের শ্রেণিভিত্তিক পদ্ধতির দুর্দান্ত কাজ করে। তবে আপনার যদি বেশ কয়েকটি থাকে তবে আপনাকে MC
প্রত্যেকের জন্য অনুরূপ একটি মেটাক্লাস তৈরি করতে হবে এবং এটি ক্লান্তিকর হতে পারে। সেক্ষেত্রে আপনার রূপককে আরও একধাপ এগিয়ে নিয়ে যাওয়া এবং একটি মেটাক্লাস ফ্যাক্টরি তৈরি করা জিনিসগুলিকে কিছুটা পরিষ্কার করে তোলে:
from __future__ import print_function
from six import with_metaclass
def custom_class_repr(name):
"""
Factory that returns custom metaclass with a class ``__repr__`` that
returns ``name``.
"""
return type('whatever', (type,), {'__repr__': lambda self: name})
class C(with_metaclass(custom_class_repr('Wahaha!'))): pass
class D(with_metaclass(custom_class_repr('Booyah!'))): pass
class E(with_metaclass(custom_class_repr('Gotcha!'))): pass
print(C, D, E)
কপি করে প্রিন্ট:
Wahaha! Booyah! Gotcha!
ধাতব প্রোগ্রামিং সাধারণত আপনার প্রতিদিনের প্রয়োজন হয় না — তবে যখন আপনার এটির প্রয়োজন হয়, এটি সত্যিই স্পটটিকে হিট করে!
সমস্ত সূক্ষ্ম উত্তরের সাথে সজ্জা সহ আমার সংস্করণ যুক্ত করুন:
from __future__ import print_function
import six
def classrep(rep):
def decorate(cls):
class RepMetaclass(type):
def __repr__(self):
return rep
class Decorated(six.with_metaclass(RepMetaclass, cls)):
pass
return Decorated
return decorate
@classrep("Wahaha!")
class C(object):
pass
print(C)
stdout- এ:
Wahaha!
নীচের দিকগুলি:
C
সুপার ক্লাস ছাড়া আপনি ঘোষণা করতে পারবেন না (না class C:
)C
দৃষ্টান্তগুলি কিছু অদ্ভুত উপার্জনের উদাহরণ হবে, সুতরাং উদাহরণগুলির জন্য এটির জন্য সম্ভবত একটি ভাল ধারণা __repr__
।