মুদ্রণ () ব্যবহার করে কোনও শ্রেণীর উদাহরণ কীভাবে প্রিন্ট করা যায়?


538

আমি পাইথনে দড়ি শিখছি। আমি যখন ফাংশনটি Foobarব্যবহার করে ক্লাসের কোনও বিষয় মুদ্রণ করার চেষ্টা করি তখন আমি print()এই জাতীয় একটি আউটপুট পাই:

<__main__.Foobar instance at 0x7ff2a18c>

কোনও শ্রেণি এবং এর অবজেক্টের মুদ্রণ আচরণ (বা স্ট্রিং উপস্থাপনা ) সেট করার কোনও উপায় আছে কি ? উদাহরণস্বরূপ, আমি যখন ক্লাস অবজেক্টে কল করি তখন আমি এর ডেটা সদস্যদের একটি নির্দিষ্ট ফর্ম্যাটে মুদ্রণ করতে চাই। পাইথনে এটি কীভাবে অর্জন করবেন?print()

আপনি যদি সি ++ ক্লাসের সাথে পরিচিত হন তবে উপরেরগুলি ক্লাসের জন্য ostreamএকটি friend ostream& operator << (ostream&, const Foobar&)পদ্ধতি যুক্ত করে স্ট্যান্ডার্ডের জন্য অর্জন করা যেতে পারে ।

উত্তর:


628
>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test

__str__পদ্ধতি কি হবে যখন আপনি এটি মুদ্রণ, এবং __repr__পদ্ধতি কি যখন আপনি ব্যবহার করেন repr()ফাংশনটি (বা আপনি ইন্টারেক্টিভ প্রম্পট এটি তাকান যখন)। যদি এটি সর্বাধিক পাইথোনিক পদ্ধতি না হয় তবে আমি ক্ষমাপ্রার্থী, কারণ আমি এখনও শিখছি - তবে এটি কার্যকর।

যদি কোনও __str__পদ্ধতি না দেওয়া হয় তবে পাইথন তার __repr__পরিবর্তে ফলাফল মুদ্রণ করবে । আপনি যদি সংজ্ঞা দিন__str__ তবে তা না করেন __repr__, পাইথন আপনাকে উপরে যা দেখবে তেমন হিসাবে ব্যবহার করবে __repr__তবে এখনও __str__মুদ্রণের জন্য ব্যবহার করবে ।


11
এছাড়াও আছে একটি এর ইউনিকোড পদ্ধতি, আপনি পরিবর্তে ব্যবহার করতে পারেন যা কার্যক্রম ; নোট যে এটি একটি ইউনিকোড বস্তু, না একটি স্ট্রিং আসতে উচিত (কিন্তু আপনি যদি একটি স্ট্রিং ফিরে ইউনিকোড রূপান্তর যাহাই হউক না কেন সম্পন্ন করা হবে ...)
kender

@ কেন্ডার - আমি এটি সম্পর্কে জানতাম না, তবে পূর্ববর্তী ক্ষেত্রে এটি পাইথন ২.x এর ভাঙ্গা ইউনিকোড হ্যান্ডলিংয়ের মাধ্যমে সঠিক ধারণা অর্জন করে।
ক্রিস লুটজ 8:38

11
আমি মনে করি এই উত্তরটি অন্য একটির সাথে লিঙ্ক ছাড়া শেষ করা যাবে না !
tnotstar

আমাকে বাঁচিয়েছে! তবে __repr __ (স্ব) পদ্ধতিটি পুনরায় প্রয়োগের পরে মুদ্রণ ব্যবহারকারীদের বিভ্রান্ত করবে। আপনি কি এর আশেপাশে কোনও সেরা অনুশীলন সম্পর্কে সচেতন?
ভিয়েট

10
জাভা প্রোগ্রামারদের কাছে: __سٹر __ (স্ব) অজগর বিশ্বের
টস্ট্রিং

134

ক্রিস লুটজ যেমন উল্লেখ করেছেন , এটি __repr__আপনার ক্লাসের পদ্ধতি দ্বারা সংজ্ঞায়িত করা হয়েছে ।

এর ডকুমেন্টেশন থেকে repr():

অনেক ধরণের ক্ষেত্রে, এই ফাংশনটি এমন স্ট্রিং ফেরত দেওয়ার চেষ্টা করে যা পাস করার সাথে সাথে একই মান সহ একটি বস্তু উত্পন্ন করবে eval(), অন্যথায় উপস্থাপনাটি একটি অতিরিক্ত স্টোরের সাথে যুক্ত বস্তুর প্রকারের নাম সম্বলিত কোণ বন্ধনীগুলিতে আবদ্ধ একটি স্ট্রিং is প্রায়শই বস্তুর নাম এবং ঠিকানা সহ including কোনও শ্রেণিটি কোনও __repr__()পদ্ধতি নির্ধারণ করে এই ফাংশনটি কীভাবে তার দৃষ্টান্তগুলির জন্য ফিরে আসে তা নিয়ন্ত্রণ করতে পারে ।

নিম্নলিখিত ক্লাস পরীক্ষা দেওয়া:

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "<Test a:%s b:%s>" % (self.a, self.b)

    def __str__(self):
        return "From str method of Test: a is %s, b is %s" % (self.a, self.b)

.. এটি পাইথন শেলটিতে নিম্নলিখিত পদ্ধতিতে কাজ করবে:

>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print repr(t)
<Test a:123 b:456>
>>> print(t)
From str method of Test: a is 123, b is 456
>>> print(str(t))
From str method of Test: a is 123, b is 456

যদি কোনও __str__পদ্ধতি সংজ্ঞায়িত না করা হয়, print(t)(বা print(str(t))) এর ফলাফল ব্যবহার করবে__repr__ পরিবর্তে

যদি কোনও __repr__পদ্ধতি সংজ্ঞায়িত না হয় তবে ডিফল্টটি ব্যবহার করা হয়, যা প্রায় সমান ..

def __repr__(self):
    return "<%s instance at %s>" % (self.__class__.__name__, id(self))

+1 তবে আপনার ক্লাস কোডগুলি আপনার __str__দেওয়া ইন্টারেক্টিভ শেলের ফলাফল থেকে পৃথক। : পি
ক্রিস লুটজ

1
ত্রুটি, উফ .. ম্যানুয়ালি REPL আউটপুট পরিবর্তন করে কখনই শেষ হয় না। আমার সম্ভবত আমার পোস্টগুলি ডক্ট করা উচিত: পি
ডিবিআর

1
%স্ট্রিং বিন্যাস অসমর্থিত হয়েছে না, থেকে docs.python.org/whatsnew/2.6.html "% অপারেটর হয় supplemented একটি অধিক শক্তিশালী স্ট্রিং পদ্ধতি, ফরম্যাট (বিন্যাস দ্বারা)"
dbr

4
ডিবিআর: এটা সত্য। মনে রাখবেন যে "পাইথন 3.0 এ নতুন কী" ডকটি "ফর্ম্যাট () পদ্ধতিটি বলেছে [...] স্ট্রিং ফর্ম্যাটিংয়ের জন্য শেষ পর্যন্ত এটিকে একমাত্র এপিআই করা এবং পাইথন ৩.১-তে% অপারেটরকে অবমূল্যায়ন করা শুরু করার পরিকল্পনা রয়েছে।"
আশ্বিন নানজাপ্পা

1
পিট্টি, %খুব সুবিধাজনক ছিল।
জানুস লেনার

52

একটি সাধারণ উপায় যা নির্দিষ্ট বিন্যাস ছাড়াই যে কোনও শ্রেণিতে প্রয়োগ করা যেতে পারে:

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return str(self.__class__) + ": " + str(self.__dict__)

এবং তারপর,

elem = Element('my_name', 'some_symbol', 3)
print(elem)

উত্পাদন করে

__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}

23

আপনি @ কিথের মতো পরিস্থিতিতে থাকলে আপনি চেষ্টা করতে পারেন:

print a.__dict__

এটি আমি ভাল শৈলী বিবেচনা করব তার বিপরীতে কিন্তু আপনি যদি কেবল ডিবাগ করার চেষ্টা করছেন তবে এটি আপনার যা করা উচিত তা করা উচিত।


আপনি কীভাবে জানতে পারবেন কীভাবে ডিক কীটির মানগুলিতে বস্তু রয়েছে কিনা?
pranaygial02

1
@ হ্যাডোপ ইভানজালিস্ট আপনি কীভাবে জিজ্ঞাসা করছেন যে কীভাবে পুনরাবৃত্তভাবে সেই সমস্ত অবজেক্টগুলি মুদ্রণ করতে হবে বা কেবল কোনও বস্তু আছে কিনা তা নির্ধারণ করতে হবে?
জন

13

@ ডিবিআর এর উত্তরে কেবল আমার দুটি সেন্ট যুক্ত করার জন্য, তিনি উল্লেখ করেছেন যে সরকারী নথিপত্র থেকে এই বাক্যটি কীভাবে প্রয়োগ করা যায় তার একটি উদাহরণ নিম্নরূপ:

"[...] একটি স্ট্রিং ফিরিয়ে আনার জন্য যা ইওল () এ পাস করার সময় একই মানের সাথে একটি বস্তু উত্পন্ন করবে, [...]"

এই শ্রেণীর সংজ্ঞা দেওয়া:

class Test(object):
    def __init__(self, a, b):
        self._a = a
        self._b = b

    def __str__(self):
        return "An instance of class Test with state: a=%s b=%s" % (self._a, self._b)

    def __repr__(self):
        return 'Test("%s","%s")' % (self._a, self._b)

Testক্লাসের উদাহরণটি সিরিয়ালকরণ করা এখন সহজ :

x = Test('hello', 'world')
print 'Human readable: ', str(x)
print 'Object representation: ', repr(x)
print

y = eval(repr(x))
print 'Human readable: ', str(y)
print 'Object representation: ', repr(y)
print

সুতরাং, কোডের শেষ টুকরোটি চালিয়ে আমরা পেয়ে যাব:

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

তবে, আমি আমার শেষ মন্তব্যে যেমন বলেছি: আরও তথ্য কেবল এখানেই !


12

আপনার ব্যবহার করা দরকার __repr__। এটি মত একটি স্ট্যান্ডার্ড ফাংশন __init__। উদাহরণ স্বরূপ:

class Foobar():
    """This will create Foobar type object."""

    def __init__(self):
        print "Foobar object is created."

    def __repr__(self):
        return "Type what do you want to see here."

a = Foobar()

print a

2
repr এবং str এর বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে: repr পাইথন উত্স হতে হবে যা একই বস্তু তৈরি করবে (এটি পুনরায়) একই বস্তু তৈরি করবে - এটি কোডে এটির repr প্রসারণ; Str বস্তুর একটি প্রশংসনীয় userland stringification হওয়া উচিত।
এরিক টাওয়ার

12

@ ব্যবহারকারী 39444430 এর প্রতিক্রিয়ার একটি সুন্দর সংস্করণ

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))

elem = Element('my_name', 'some_symbol', 3)
print(elem)

নাম এবং মানগুলির দৃশ্যত দুর্দান্ত তালিকা তৈরি করে।

<class '__main__.Element'>
name = my_name
symbol = some_symbol
number = 3

এমনকি একটি ফ্যানসিয়ার সংস্করণ (ধন্যবাদ রউড) আইটেমগুলি সাজায়:

def __str__(self):
    return  str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))

8

পাইথন 3 এর জন্য:

যদি নির্দিষ্ট ফর্ম্যাটটি গুরুত্বপূর্ণ না হয় (যেমন ডিবাগিংয়ের জন্য) কেবল নীচের মুদ্রণযোগ্য বর্গ থেকে উত্তরাধিকারী। প্রতিটি বস্তুর জন্য কোড লেখার দরকার নেই।

এই উত্তর দ্বারা অনুপ্রাণিত

class Printable:
    def __repr__(self):
        from pprint import pformat
        return "<" + type(self).__name__ + "> " + pformat(vars(self), indent=4, width=1)

# Example Usage
class MyClass(Printable):
    pass

my_obj = MyClass()
my_obj.msg = "Hello"
my_obj.number = "46"
print(my_obj)

1

এই থ্রেডটিতে ইতিমধ্যে প্রচুর উত্তর রয়েছে তবে এর মধ্যে কেউই আমাকে বিশেষভাবে সহায়তা করেনি, আমাকে নিজেই এটি কাজ করতে হয়েছিল, তাই আমি আশা করি এটি উত্তরটি আরও কিছুটা তথ্যপূর্ণ।

আপনার ক্লাস শেষে আপনার প্রথম বন্ধনী রয়েছে তা নিশ্চিত করতে হবে, যেমন:

print(class())

আমি যে প্রকল্পে কাজ করছি তার কোডের একটি উদাহরণ এখানে:

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number
    def __str__(self):
        return "{}: {}\nAtomic Number: {}\n".format(self.name, self.symbol, self.number

class Hydrogen(Element):
    def __init__(self):
        super().__init__(name = "Hydrogen", symbol = "H", number = "1")

আমার হাইড্রোজেন ক্লাসটি মুদ্রণ করতে, আমি নিম্নলিখিতগুলি ব্যবহার করেছি:

print(Hydrogen())

দয়া করে মনে রাখবেন, হাইড্রোজেনের শেষে এটি প্রথম বন্ধনী ছাড়া কাজ করবে না। তারা প্রয়োজনীয়।

আশা করি এটি সহায়তা করে, আপনার যদি আরও প্রশ্ন থাকে তবে আমাকে জানান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.