python - __Str__ এবং__repr__ এর মধ্যে পার্থক্য?




magic-methods (14)

Python __str__ এবং __repr__ মধ্যে পার্থক্য কি?


পাইথন __str__ এবং __repr__ মধ্যে পার্থক্য কি?

__str__ ("ডunder (ডাবল-আন্ডারস্কোর) স্ট্রিং" হিসাবে পড়ুন) এবং __repr__ ("ডান্ডার-রেপার" ("উপস্থাপনা" এর জন্য) হিসাবে পড়া) উভয় বিশেষ পদ্ধতি যা বস্তুর অবস্থার উপর ভিত্তি করে স্ট্রিংগুলি ফেরত দেয়।

__repr__ __str__ অনুপস্থিত থাকলে ব্যাকআপ আচরণ সরবরাহ করে।

সুতরাং প্রথমে একটি __repr__ লিখতে হবে যা আপনাকে স্ট্রিং থেকে একটি সমতুল্য বস্তুর __repr__ করতে দেয় যেমন eval ব্যবহার করে বা পাইথন শেলের মধ্যে চরিত্রের জন্য অক্ষরে টাইপ করে।

যে কোন সময় পরে, কেউ একজন ব্যবহারকারীর পাঠযোগ্য স্ট্রিং উপস্থাপনের জন্য একটি __str__ লিখতে পারে, যখন কেউ এটি প্রয়োজনীয় বলে বিশ্বাস করে।

__str__

যদি আপনি কোনও বস্তু প্রিন্ট করেন, বা এটি format , str.format , অথবা str str.format format , তবে যদি __str__ পদ্ধতিটি সংজ্ঞায়িত করা হয়, তবে সেই পদ্ধতিটি বলা হবে, অন্যথা, __repr__ ব্যবহার করা হবে।

__repr__

__repr__ পদ্ধতিটি __repr__ ফাংশন repr দ্বারা বলা হয় এবং এটি আপনার পাইথন শেলের প্রতি ইকো করা হয় যখন এটি একটি অবজেক্টের মূল্যায়ন মূল্যায়ন করে।

যেহেতু এটি __str__ জন্য ব্যাকআপ __str__ , যদি আপনি শুধুমাত্র একটি লিখতে পারেন তবে __repr__ দিয়ে শুরু করুন

এখানে repr উপর নির্মিত সাহায্য:

repr(...)
    repr(object) -> string

    Return the canonical string representation of the object.
    For most object types, eval(repr(object)) == object.

অর্থাৎ, অধিকাংশ বস্তুর জন্য, যদি আপনি repr দ্বারা প্রিন্ট করাতে টাইপ করেন তবে আপনি সমতুল্য বস্তু তৈরি করতে সক্ষম হবেন। কিন্তু এটি ডিফল্ট বাস্তবায়ন নয়।

__repr__ ডিফল্ট বাস্তবায়ন

ডিফল্ট বস্তু __repr__ হল ( সি পাইথন উৎস ) এর মতো কিছু:

def __repr__(self):
    return '<{0}.{1} object at {2}>'.format(
      self.__module__, type(self).__name__, hex(id(self)))

এর মানে ডিফল্টরূপে আপনি মডিউলে মুদ্রণ করবেন, বস্তুর নাম, এবং মেমরিতে তার অবস্থানের হেক্সাডেসিমাল উপস্থাপনা - উদাহরণস্বরূপ:

<__main__.Foo object at 0x7f80665abdd0>

এই তথ্যটি খুব দরকারী নয়, তবে কোনও নির্দিষ্ট উদাহরণের একটি ক্যানোনিক্যাল উপস্থাপনাটি সঠিকভাবে কীভাবে তৈরি করতে পারে তা বের করার কোন উপায় নেই এবং এটি আমাদের কাছে স্মৃতিতে অনন্যভাবে কীভাবে সনাক্ত করা যায় তা অন্তত আমাদের বলার অপেক্ষা রাখে না।

কিভাবে __repr__ দরকারী হতে পারে?

পাইথন শেল এবং datetime অবজেক্টগুলি ব্যবহার করে এটি কীভাবে উপযোগী হতে পারে তা দেখুন। প্রথমে আমাদের datetime মডিউল আমদানি করতে হবে:

import datetime

শেলের সময় আমরা যদি datetime.now কল করি। এখন আমরা সমতুল্য ডটটাইম অবজেক্ট পুনরূদ্ধার করতে যাব। এটি ডেটাটাইম __repr__ দ্বারা তৈরি করা হয়েছে:

>>> datetime.datetime.now()
datetime.datetime(2015, 1, 24, 20, 5, 36, 491180)

যদি আমরা একটি ডেটাটাইম বস্তু মুদ্রণ করি, আমরা একটি চমৎকার মানুষের পঠনযোগ্য (আসলে, ISO) বিন্যাস দেখতে পাই। এটি __str__ এর __str__ দ্বারা প্রয়োগ করা হয়:

>>> print(datetime.datetime.now())
2015-01-24 20:05:44.977951

এটি হ'ল আমরা যে বস্তুটি হারিয়েছি তা পুনরাবৃত্তি করার একটি সহজ বিষয়, কারণ আমরা __repr__ আউটপুট থেকে অনুলিপি এবং আটকানো এবং এটি মুদ্রণ করে একটি পরিবর্তনশীলকে বরাদ্দ করতে পারি নি এবং আমরা এটি অন্য বস্তুর মতো একই মানব পাঠযোগ্য আউটপুটতে পাই:

>>> the_past = datetime.datetime(2015, 1, 24, 20, 5, 36, 491180)
>>> print(the_past)
2015-01-24 20:05:36.491180

আমি কিভাবে তাদের বাস্তবায়ন করব?

আপনি যখন উন্নয়নশীল হন, তখন আপনি যদি সম্ভব হয় তবে একই অবস্থায় বস্তুর পুনরুত্পাদন করতে সক্ষম হবেন। এটি, উদাহরণস্বরূপ, ডেটাটাইম অবজেক্টটি __repr__ ( পাইথন উৎস ) কীভাবে সংজ্ঞায়িত করে। এটি মোটামুটি জটিল, কারণ এমন বস্তুর পুনরুত্পাদন করার জন্য প্রয়োজনীয় সমস্ত গুণাবলী:

def __repr__(self):
    """Convert to formal string, for repr()."""
    L = [self._year, self._month, self._day, # These are never zero
         self._hour, self._minute, self._second, self._microsecond]
    if L[-1] == 0:
        del L[-1]
    if L[-1] == 0:
        del L[-1]
    s = ", ".join(map(str, L))
    s = "%s(%s)" % ('datetime.' + self.__class__.__name__, s)
    if self._tzinfo is not None:
        assert s[-1:] == ")"
        s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")"
    return s

আপনি যদি আপনার বস্তুর আরো মানব পাঠযোগ্য উপস্থাপনাটি চান তবে আপনি পরবর্তী __str__ প্রয়োগ করতে পারেন। এখানে ডেটাটাইম অবজেক্ট ( পাইথন উৎস ) __str__ প্রয়োগ __str__ , যা এটি সহজে করে কারণ এটি ইতিমধ্যে একটি ফরম্যাট রয়েছে যা এটি ISO ফর্ম্যাটে প্রদর্শন করতে পারে:

def __str__(self):
    "Convert to string, for str()."
    return self.isoformat(sep=' ')

__repr__ = __str__ সেট করুন?

এটি এখানে অন্য উত্তরটির সমালোচনা যা প্রস্তাব করে __repr__ = __str__

__repr__ = __str__ সেট করা হচ্ছে মূর্খ - __repr__ __str__ এবং একটি __repr__ জন্য একটি __repr__ , ডিবাগিংয়ের জন্য ডেভেলপারদের ব্যবহারের জন্য লিখিত, আপনাকে __str__ লিখার আগে লিখতে হবে।

আপনি শুধুমাত্র একটি __str__ প্রয়োজন যখন আপনি বস্তুর একটি টেক্সট উপস্থাপনা প্রয়োজন।

উপসংহার

আপনি লেখার বস্তুগুলির জন্য __repr__ নির্ধারণ করুন যাতে আপনি এবং অন্যান্য বিকাশকারীর এটির ব্যবহার করার সময় এটি পুনরুত্পাদনযোগ্য উদাহরণ থাকে। আপনি যখন এটি একটি মানুষের পঠনযোগ্য স্ট্রিং উপস্থাপনা প্রয়োজন __str__ সংজ্ঞা।


মনে রাখা একটি গুরুত্বপূর্ণ বিষয় যে ধারক এর __str__ বস্তু ব্যবহার করে ' __repr__

>>> from datetime import datetime
>>> from decimal import Decimal
>>> print (Decimal('52'), datetime.now())
(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 51, 26, 185000))
>>> str((Decimal('52'), datetime.now()))
"(Decimal('52'), datetime.datetime(2015, 11, 16, 10, 52, 22, 176000))"

পাইথন পঠনযোগ্যতার উপর __str__ সমর্থন করে , একটি tuple এর __str__ কলটি বস্তুর ' __repr__ , "আনুষ্ঠানিক" একটি বস্তুর উপস্থাপনাকে কল করে। আনুষ্ঠানিক উপস্থাপনাটি একটি অনানুষ্ঠানিকের তুলনায় পড়তে কঠিন হলেও, এটি অস্পষ্ট এবং বাগগুলির বিরুদ্ধে আরো শক্তিশালী।


অন্যান্য উত্তর অনুপস্থিত যে এক দৃষ্টিভঙ্গি। এটা সত্য যে সাধারণভাবে প্যাটার্ন হয়:

  • __str__ লক্ষ্য: মানুষের পঠনযোগ্য
  • __repr__ লক্ষ্য: অস্পষ্ট, সম্ভাব্য মেশিন-পাঠযোগ্য eval মাধ্যমে

দুর্ভাগ্যবশত, এই __repr__ ত্রুটিযুক্ত, কারণ পাইথন রিপিএল এবং __repr__ একটি রিপিএল কনসোলের মুদ্রণ বস্তুর জন্য __repr__ ব্যবহার করে ( Python এবং IPython সম্পর্কিত সম্পর্কিত প্রশ্ন দেখুন)। সুতরাং, ইন্টারেক্টিভ কনসোল কাজ (যেমন, নুম্পি বা পান্ডাস) জন্য লক্ষ্য করা প্রকল্পগুলি উপরে নিয়ম উপেক্ষা করতে এবং পরিবর্তে একটি মানব পাঠযোগ্য __repr__ বাস্তবায়ন প্রদান করতে শুরু করেছে।


আপনি বিশেষত অন্যথায় নিশ্চিত করার জন্য কাজ না করা পর্যন্ত, অধিকাংশ ক্লাসের জন্য উভয় সহায়ক ফলাফল নেই:

>>> class Sic(object): pass
... 
>>> print str(Sic())
<__main__.Sic object at 0x8b7d0>
>>> print repr(Sic())
<__main__.Sic object at 0x8b7d0>
>>> 

যেমন আপনি দেখেন - কোনও পার্থক্য নেই এবং শ্রেণী এবং বস্তুর id ছাড়াই কোনও তথ্য নেই। যদি আপনি কেবলমাত্র দুইটি একটি ওভাররাইড করেন ...:

>>> class Sic(object): 
...   def __repr__(object): return 'foo'
... 
>>> print str(Sic())
foo
>>> print repr(Sic())
foo
>>> class Sic(object):
...   def __str__(object): return 'foo'
... 
>>> print str(Sic())
foo
>>> print repr(Sic())
<__main__.Sic object at 0x2617f0>
>>> 

যেমন আপনি দেখেন, যদি আপনি __repr__ ওভাররাইড __repr__ , __repr__ এর জন্য ব্যবহৃত হয় তবে বিপরীত নয়।

অন্য গুরুত্বপূর্ণ __str__ জানতে: __str__ একটি অন্তর্নির্মিত কন্টেইনারে __repr__ ব্যবহার করে, __repr__ নয়, __str__ থাকা আইটেমগুলির জন্য। এবং, সাধারণ দস্তাবেজে প্রাপ্ত বিষয়ের উপর থাকা সত্ত্বেও, __repr__ ব্যক্তি বস্তুর __repr__ তৈরি করতে বিরক্ত করে না এমন একটি স্ট্রিং যা __repr__ একটি সমান বস্তু তৈরি করতে ব্যবহার করতে পারে (এটি খুব কঠিন, এবং কীভাবে প্রাসঙ্গিক মডিউলটি আসলে আমদানি করা হয়েছে তা __repr__ নয়) এটা আসলে অসম্ভব সমতল আউট)।

সুতরাং, আমার পরামর্শ: __str__ যথাযথভাবে মানব-পঠনযোগ্য এবং __repr__ হিসাবে আপনি __repr__ সম্ভব স্পষ্ট করে তুলতে ফোকাস করুন, এমনকি যদি __repr__ এর ফেরত মানটিকে __eval__ এ ইনপুট হিসাবে __repr__ দেওয়ার অস্পষ্ট লক্ষ্যটি হস্তক্ষেপ করে!


থাম্ব আমার নিয়ম: __repr__ ডেভেলপারদের জন্য, __str__ গ্রাহকদের জন্য।


থেকে http://pyref.infogami.com/__str__ effbot দ্বারা:

__str__ "কোনও বস্তুর" অনানুষ্ঠানিক "স্ট্রিং উপস্থাপনাকে গণনা করে। এটি __repr__ থেকে পৃথক যে এটি বৈধ পাইথন অভিব্যক্তি হতে হবে না: পরিবর্তে আরও সুবিধাজনক বা সংক্ষিপ্ত উপস্থাপনা ব্যবহার করা যেতে পারে।"


সংক্ষেপে:

class Demo:
  def __repr__(self):
    return 'repr'
  def __str__(self):
    return 'str'

demo = Demo()
print(demo) # use __str__, output 'str' to stdout

s = str(demo) # __str__ is used, return 'str'
r = repr(demo) # __repr__ is used, return 'repr'

import logging
logger = logging.getLogger(logging.INFO)
logger.info(demo) # use __str__, output 'str' to stdout

from pprint import pprint, pformat
pprint(demo) # use __repr__, output 'repr' to stdout
result = pformat(demo) # use __repr__, result is string which value is 'str'

সব সততা, eval(repr(obj)) কখনও ব্যবহার করা হয় না। যদি আপনি এটি ব্যবহার করে নিজেকে খুঁজে পান তবে আপনাকে থামাতে হবে, কারণ eval বিপজ্জনক, এবং স্ট্রিংগুলি আপনার বস্তুগুলিকে ক্রমানুসারে কার্যকর করার পক্ষে খুব অদক্ষ উপায় (পরিবর্তে pickle ব্যবহার করুন)।

অতএব, আমি __repr__ = __str__ সেটিং করার সুপারিশ __repr__ = __str__ । কারণটি হল str(list) উপাদানগুলিতে repr কে কল করে (আমি পাইথনের বৃহত্তম ডিজাইন ত্রুটিগুলির মধ্যে একটি হিসাবে এটি পাইথন 3 দ্বারা চিহ্নিত করা হয়নি বলে মনে করি)। একটি প্রকৃত repr সম্ভবত print [your, objects] আউটপুট হিসাবে খুব সহায়ক হবে না।

এটির যোগ্যতা অর্জনের জন্য, আমার অভিজ্ঞতাতে, repr ফাংশনের সবচেয়ে কার্যকর ব্যবহার repr অন্য স্ট্রিংয়ের মধ্যে একটি স্ট্রিং স্থাপন করা (স্ট্রিং ফর্ম্যাটিং ব্যবহার করে)। এই ভাবে, আপনি উদ্ধৃতি বা কিছু escaping সম্পর্কে চিন্তা করতে হবে না। কিন্তু এখানে ঘটছে কোন eval আছে যে নোট।


হ্যান্স পেটার ল্যাংটাঙ্গেনের কম্পিউটেশনাল বিজ্ঞানের জন্য পাইথন স্ক্রিপ্টিংয়ের বইয়ের 358 পৃষ্ঠায় এটি পরিষ্কারভাবে বলে যে

  • __repr__ লক্ষ্যটির সম্পূর্ণ স্ট্রিং উপস্থাপনায় লক্ষ্য রাখে;
  • __str__ মুদ্রণের জন্য একটি চমত্কার স্ট্রিং ফিরে।

সুতরাং, আমি তাদের হিসাবে বুঝতে চাই

  • repr = পুনরুত্পাদন
  • str = স্ট্রিং (উপস্থাপনা)

ব্যবহারকারীর দৃষ্টিকোণ থেকে যদিও এটি পাইথন শেখার সময় একটি ভুল বোঝাবুঝি।

নিম্নরূপ একই পৃষ্ঠায় একটি ছোট কিন্তু ভাল উদাহরণ দেওয়া হয়েছে:

উদাহরণ

In [38]: str('s')
Out[38]: 's'

In [39]: repr('s')
Out[39]: "'s'"

In [40]: eval(str('s'))
Traceback (most recent call last):

  File "<ipython-input-40-abd46c0c43e7>", line 1, in <module>
    eval(str('s'))

  File "<string>", line 1, in <module>

NameError: name 's' is not defined


In [41]: eval(repr('s'))
Out[41]: 's'

blog থেকে অনেক পরিষ্কার

str স্ট্রিং মত। তৈরি করা হয়েছে তাই আপনি ডাটা repr মুদ্রণ করতে পারেন serialize, বা আচমকা মত। আমি eval ব্যবহার করে যদি তাই করতে হবে যদি আমি এই বস্তু পুনরূদ্ধার করবেন না ()

>>> import datetime
>>> now = datetime.datetime.now() 
>>> str(now)
'2015-04-04 20:51:31.766862'
>>> repr(now)
'datetime.datetime(2015, 4, 4, 20, 51, 31, 766862)'
>>mydate = eval(repr(now))

__str__ এবং __repr__ বোঝা __str__ এবং স্থায়ীভাবে তাদের মধ্যে পার্থক্য।

__str__ চোখ পঠনযোগ্য জন্য একটি নির্দিষ্ট বস্তুর স্ট্রিং ছদ্মবেশী শরীর ফিরে
__repr__ একটি নির্দিষ্ট বস্তুর আসল মাংসের দেহটি ফেরত __repr__ (স্বতঃস্ফূর্ত) সনাক্ত করতে __repr__ জন্য।

একটি উদাহরণ এটি দেখুন

In [30]: str(datetime.datetime.now())
Out[30]: '2017-12-07 15:41:14.002752'
Disguised in string form

__repr__ হিসাবে

In [32]: datetime.datetime.now()
Out[32]: datetime.datetime(2017, 12, 7, 15, 43, 27, 297769)
Presence in real body which allows to be manipulated directly.

আমরা __repr__ ফলাফল সুবিধার উপর গাণিতিক ক্রিয়াকলাপ করতে পারি।

In [33]: datetime.datetime.now()
Out[33]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521)
In [34]: datetime.datetime(2017, 12, 7, 15, 47, 9, 741521) - datetime.datetime(2
    ...: 017, 12, 7, 15, 43, 27, 297769)
Out[34]: datetime.timedelta(0, 222, 443752)

__str__ উপর অপারেশন প্রয়োগ করা __str__

In [35]: '2017-12-07 15:43:14.002752' - '2017-12-07 15:41:14.002752'
TypeError: unsupported operand type(s) for -: 'str' and 'str'

ত্রুটি কিন্তু কিছুই ফেরত দেয়।

আরেকটি উদাহরণ.

In [36]: str('string_body')
Out[36]: 'string_body' # in string form

In [37]: repr('real_body')
Out[37]: "'real_body'" #its real body hide inside

এই উত্তর আপনি আরো উত্তর অন্বেষণ করতে কংক্রিট স্থল নির্মাণ সাহায্য।


str - প্রদত্ত বস্তুর থেকে একটি নতুন স্ট্রিং বস্তু তৈরি করে।

repr - বস্তুর ক্যানোনিকাল স্ট্রিং উপস্থাপনা প্রদান করে।

পার্থক্য:

Str ():

  • বস্তু পঠনযোগ্য করে তোলে
  • শেষ ব্যবহারকারীর জন্য আউটপুট উৎপন্ন করে

repr ():

  • বস্তু reproduces যে কোড প্রয়োজন
  • বিকাশকারী জন্য আউটপুট উৎপন্ন করে

Alex ভাল সংক্ষেপে কিন্তু, বিস্ময়করভাবে, খুব সংক্ষিপ্ত ছিল।

প্রথমে, আমাকে Alex এর পোস্টে প্রধান পয়েন্টগুলি পুনরাবৃত্তি করতে দিন:

  • ডিফল্ট বাস্তবায়ন নিরর্থক (এটি এমন হবে না যা মনে করা কঠিন, তবে হ্যাঁ)
  • __repr__ লক্ষ্য অস্পষ্ট হতে হয়
  • __str__ লক্ষ্য পাঠযোগ্য হতে হয়
  • ধারক এর __str__ অন্তর্ভুক্ত বস্তু ব্যবহার করে ' __repr__

ডিফল্ট বাস্তবায়ন নিরর্থক

এটি বেশিরভাগই আশ্চর্যজনক কারণ পাইথনের ডিফল্টগুলি মোটামুটি কার্যকর বলে মনে হয়। যাইহোক, এই ক্ষেত্রে, __repr__ জন্য ডিফল্ট __repr__ যা এরকম কাজ করবে:

return "%s(%r)" % (self.__class__, self.__dict__)

খুব বিপজ্জনক হয়েছে (উদাহরণস্বরূপ, বস্তু একে অপরের রেফারেন্স যদি অসীম পুনরাবৃত্তি মধ্যে পেতে খুব সহজ)। তাই পাইথন আউট পুলিশ। মনে রাখবেন যে একটি ডিফল্ট যা সত্য: যদি __repr__ সংজ্ঞায়িত করা হয়, এবং __str__ হয় না তবে বস্তুটি __str__=__repr__ হিসাবে আচরণ করবে।

এর অর্থ হল, সহজ শর্তাবলী: আপনার প্রয়োগ করা প্রায় প্রতিটি বস্তুর একটি কার্যকরী __repr__ থাকা উচিত যা বস্তুটি বোঝার জন্য ব্যবহারযোগ্য। __str__ করা ঐচ্ছিক: এটি যদি আপনাকে "প্রশংসনীয় মুদ্রণ" কার্যকারিতা (উদাহরণস্বরূপ, একটি রিপোর্ট জেনারেটরের দ্বারা ব্যবহৃত হয়) করতে হবে।

__repr__ লক্ষ্য অস্পষ্ট হতে হয়

আমাকে ডানদিকে আসতে বলুন - আমি ডিবাগারগুলিতে বিশ্বাস করি না। আমি সত্যিই কোন ডিবাগার ব্যবহার করতে জানি না, এবং এক গুরুত্ব সহকারে ব্যবহার না। উপরন্তু, আমি বিশ্বাস করি যে ডিবাগারগুলির মধ্যে বড় দোষ তাদের মৌলিক প্রকৃতির - অনেকগুলি ব্যর্থতা আমি অনেক দিন আগে ঘটেছি, একটি গ্যালাক্সি থেকে অনেক দূরে। এর অর্থ হচ্ছে, আমি বিশ্বাস করি, ধর্মীয় উৎসাহের সাথে, লগ ইন করে। লগিং কোনও উপযুক্ত আগুন-এবং-ভুলে সার্ভার সিস্টেমের জীবনযাত্রা। পাইথন এটিকে লগ করতে সহজ করে তোলে: সম্ভবত কিছু প্রকল্প নির্দিষ্ট মোড়কের সাথে, আপনার যা দরকার তা হল a

log(INFO, "I am in the weird function and a is", a, "and b is", b, "but I got a null C — using default", default_c)

কিন্তু আপনাকে শেষ ধাপটি করতে হবে - নিশ্চিত করুন যে আপনার প্রয়োগ করা প্রতিটি বস্তুর একটি দরকারী repr আছে, তাই কোডটি ঠিক কাজ করতে পারে। এই কারণেই "eval" জিনিসটি আসে: যদি আপনার কাছে যথেষ্ট তথ্য থাকে তবে eval(repr(c))==c , এর অর্থ হল আপনি জানেন যে c সম্পর্কে সবকিছু জানা আছে। যদি এটি যথেষ্ট সহজ, অন্তত একটি অস্পষ্ট ভাবে, এটি করুন। যদি না হয়, তবুও c সম্পর্কে যথেষ্ট তথ্য আছে তা নিশ্চিত করুন। আমি সাধারণত একটি "MyClass(this=%r,that=%r)" % (self.this,self.that) মত বিন্যাস ব্যবহার করুন: "MyClass(this=%r,that=%r)" % (self.this,self.that) । এর অর্থ এই নয় যে আপনি প্রকৃতপক্ষে MyClass তৈরি করতে পারেন, অথবা এটি সঠিক কন্সট্রাক্টর আর্গুমেন্টগুলি - তবে এটি "এটির বিষয়ে আপনার প্রয়োজনীয় সবকিছুই" প্রকাশ করার একটি কার্যকর ফর্ম।

দ্রষ্টব্য: আমি উপরে %r ব্যবহৃত, %s না। আপনি সর্বদা __repr__ প্রয়োগের ভিতরে repr() [অথবা %r বিন্যাসকরণ অক্ষর, সমানভাবে] ব্যবহার করতে চান, অথবা আপনি repr এর লক্ষ্যটি __repr__ । আপনি MyClass(3) এবং MyClass("3") আলাদা করতে সক্ষম হতে চান।

__str__ লক্ষ্যটি পাঠযোগ্য হতে হবে

বিশেষত, এটি আলাদা হতে উদ্দেশ্যে নয় - লক্ষ্য করুন যে str(3)==str("3") । একইভাবে, যদি আপনি একটি আইপি বিমূর্ততা বাস্তবায়ন করেন, তবে এটির স্ট্রিংটি 19২.168.1.1 এর মতো দেখতে ঠিক। একটি তারিখ / সময় বিমূর্তকরণ বাস্তবায়ন করার সময়, str "2010/4/12 15:35:22" ইত্যাদি হতে পারে। লক্ষ্যটি এমনভাবে উপস্থাপিত করা যে কোনও ব্যবহারকারী প্রোগ্রামার নয়, এটি পড়তে চায়। নিরপেক্ষ সংখ্যাগুলি বন্ধ করুন, অন্য কোন শ্রেণী হতে জাহির করুন - যতক্ষণ এটি পাঠযোগ্যতা সমর্থন করে, এটি একটি উন্নতি।

ধারক এর __str__ অন্তর্ভুক্ত বস্তু ব্যবহার করে ' __repr__

এই আশ্চর্যজনক মনে হচ্ছে, তাই না? এটি একটি সামান্য, কিন্তু কিভাবে পঠনযোগ্য হবে

[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]

থাকা? বেশি না. বিশেষত, একটি ধারক মধ্যে স্ট্রিং তার স্ট্রিং উপস্থাপনা বিরক্ত করা সহজ উপায় খুঁজে পেতে হবে। অস্পষ্টতার মুখে, পাইথন অনুমান করার প্রলোভনকে প্রতিরোধ করেন। আপনি যখন তালিকাটি মুদ্রণ করছেন তখন উপরের আচরণটি চান

print "[" + ", ".join(l) + "]"

(আপনি সম্ভবত অভিধান সম্পর্কে কি চিন্তা করতে পারেন।

সারাংশ

বাস্তবায়ন __repr__ বাস্তবায়ন __repr__ কোন ক্লাসের জন্য। এই দ্বিতীয় প্রকৃতি হতে হবে। __str__ প্রয়োগ __str__ যদি আপনি মনে করেন এটি একটি স্ট্রিং সংস্করণ আছে যা আরো অস্পষ্টতার পক্ষে আরও পঠনযোগ্যতার পাশে ভুল করে।


"A basic requirement for a Python object is to provide usable 
 string   representations of itself, one used for debugging and
 logging, another for presentation to end users. That is why the  
 special methods __repr__ and __str__ exist in the data model."

বই থেকে: Fluent পাইথন





repr