কোনও শ্রেণি অবজেক্টের জন্য কাস্টম স্ট্রিং উপস্থাপনা কীভাবে তৈরি করবেন?


202

এই শ্রেণি বিবেচনা করুন:

class foo(object):
    pass

ডিফল্ট স্ট্রিংয়ের উপস্থাপনাটি এরকম কিছু দেখায়:

>>> str(foo)
"<class '__main__.foo'>"

আমি কীভাবে এই প্রদর্শনকে একটি কাস্টম স্ট্রিং তৈরি করতে পারি?

উত্তর:


272

প্রয়োগ করুন __str__()বা __repr__()শ্রেণীর মেটাগ্লাসে।

class MC(type):
  def __repr__(self):
    return 'Wahaha!'

class C(object):
  __metaclass__ = MC

print C

__str__আপনি যদি পঠনযোগ্য স্ট্রিংফিকেশন বলতে চান তবে ব্যবহার করুন , __repr__দ্ব্যর্থহীন উপস্থাপনার জন্য ব্যবহার করুন ।


2
আমি এক ধরণের শ্রেণি সাজসজ্জা তৈরি করতে চাই, তাই আমি প্রতিটি শ্রেণীর জন্য একটি মেটাগ্লাস না লিখে সহজেই আমার ক্লাসগুলির জন্য কাস্টম স্ট্রিং উপস্থাপনাগুলি সেট করতে পারি। পাইথনের মেটাক্লাসগুলির সাথে আমি খুব বেশি পরিচিত নই, আপনি কি আমাকে সেখানে কোনও পয়েন্টার দিতে পারেন?
বুর্জন ​​পোলেক্স

দুর্ভাগ্যক্রমে এটি শ্রেণীর সাজসজ্জার সাথে করা যায় না; শ্রেণি সংজ্ঞায়িত হওয়ার সময় এটি সেট করতে হবে।
ইগনাসিও ওয়াজকেজ-আব্রামস

10
@ Space_C0wb0y: আপনি মত একটি স্ট্রিং যোগ করতে পারিনি _representationবর্গ শরীর থেকে এবং return self._representation__repr__()ক্লাসের অধীনে একটি ক্লাস পদ্ধতি।
সোভেন মারনাচ

@ বিজার্নপ্লেক্স আপনি সাজসজ্জার দিয়ে এটিকে টানতে সক্ষম হতে পারেন তবে আমি আশা করব যে আপনাকে ভাষার অনেক সূক্ষ্মতার সাথে লড়াই করতে হবে। এমনকি আপনি যদি না করেন তবে আপনি এখনও কোনও উপায়ে মেটাক্লাস ব্যবহার করতে বাধ্য কারণ আপনি __repr__প্রতিনিধিত্ব করতে ডিফল্টটি ব্যবহার করতে চান না C_representationসদস্য থাকার বিকল্প হ'ল একটি মেটাক্লাস ফ্যাক্টরি তৈরি করা যা যথাযথভাবে একটি মেটাক্লাস উত্পাদন করে __repr__(আপনি যদি এটি ব্যবহার করছেন তবে এটি দুর্দান্ত হতে পারে)।
10


22
class foo(object):
    def __str__(self):
        return "representation"
    def __unicode__(self):
        return u"representation"

10
এটি instancesক্লাসের জন্য স্ট্রিং প্রতিনিধিত্ব পরিবর্তন করে , ক্লাসের জন্য নয়।
তোরান

দুঃখিত, আপনার পোস্টের দ্বিতীয় অংশ দেখতে পাচ্ছেন না। উপরে পদ্ধতি ব্যবহার করুন।
আন্দ্রে গুবারেভ

6
@ রবার্টসিমার কেন? যদিও তার উত্তরটি ওপির প্রশ্নটিকে বিশেষভাবে লক্ষ্যবস্তু করছে না, এটি এখনও সহায়ক। এটা আমাকে সাহায্য করেছে। এবং এক নজরে, আমি উদাহরণ প্রয়োগের জন্য জিজ্ঞাসা কোন প্রশ্ন দেখতে পাচ্ছি না। সুতরাং সম্ভবত এই পৃষ্ঠায় লোকেরা অবতরণ করছে।
আকিনুরি

14

যদি আপনাকে প্রথমটির মধ্যে বেছে নিতে হয় __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

1
__repr__বনাম সম্পর্কে আপনার মতামতটি __str__সঠিক হলেও এটি প্রকৃত প্রশ্নের উত্তর দেয় না, যা শ্রেণিক-বস্তু সম্পর্কিত, উদাহরণ নয়।
বিজন পোলাক্স

প্রতিক্রিয়াটির জন্য ধন্যবাদ, পুরোপুরি এটি তদারকি করুন। আমাকে আমার উত্তর পর্যালোচনা করতে দিন।
ব্যবহারকারী 1767754

আমি মনে করি আপনি repr এবং str এর প্রয়োগগুলি অদলবদল করেছেন।
jspencer

4

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!

ধাতব প্রোগ্রামিং সাধারণত আপনার প্রতিদিনের প্রয়োজন হয় না — তবে যখন আপনার এটির প্রয়োজন হয়, এটি সত্যিই স্পটটিকে হিট করে!


0

সমস্ত সূক্ষ্ম উত্তরের সাথে সজ্জা সহ আমার সংস্করণ যুক্ত করুন:

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!

নীচের দিকগুলি:

  1. Cসুপার ক্লাস ছাড়া আপনি ঘোষণা করতে পারবেন না (না class C:)
  2. Cদৃষ্টান্তগুলি কিছু অদ্ভুত উপার্জনের উদাহরণ হবে, সুতরাং উদাহরণগুলির জন্য এটির জন্য সম্ভবত একটি ভাল ধারণা __repr__
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.