পাইথন শ্রেণীর উত্তরাধিকারে ডায়ারস্টিংগুলির উত্তরাধিকারী


101

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

  • বেস ক্লাস ডকস্ট্রিং উত্তরাধিকারী
  • হতে পারে ডাস্ট্রিংয়ের সাথে প্রাসঙ্গিক অতিরিক্ত ডকুমেন্টেশন যুক্ত করুন

শ্রেণির উত্তরাধিকারের পরিস্থিতিতে এই ধরণের ডাস্ট্রিং ম্যানিপুলেশন করার কোনও (সম্ভবত মার্জিত বা পাইথোনিক) উপায় আছে কি? একাধিক উত্তরাধিকার সম্পর্কে কীভাবে?


4
আমি উত্তর দিতে পারছি না কারণ প্রশ্নটি দুর্ভাগ্যক্রমে বন্ধ ছিল, তবে পাইথন ৩.৫ inspect.getdocঅনুসারে উত্তরাধিকার গাছটি ডক্টরিং না পাওয়া পর্যন্ত অনুসন্ধান করবে।
অঙ্কিত

উত্তর:


39

আপনি শুধু একজন না! এই comp.lang.pythonসম্পর্কে কিছুক্ষণ আগে আলোচনা হয়েছিল এবং একটি রেসিপি তৈরি করা হয়েছিল। এটি এখানে দেখুন

"""
doc_inherit decorator

Usage:

class Foo(object):
    def foo(self):
        "Frobber"
        pass

class Bar(Foo):
    @doc_inherit
    def foo(self):
        pass 

Now, Bar.foo.__doc__ == Bar().foo.__doc__ == Foo.foo.__doc__ == "Frobber"
"""

from functools import wraps

class DocInherit(object):
    """
    Docstring inheriting method descriptor

    The class itself is also used as a decorator
    """

    def __init__(self, mthd):
        self.mthd = mthd
        self.name = mthd.__name__

    def __get__(self, obj, cls):
        if obj:
            return self.get_with_inst(obj, cls)
        else:
            return self.get_no_inst(cls)

    def get_with_inst(self, obj, cls):

        overridden = getattr(super(cls, obj), self.name, None)

        @wraps(self.mthd, assigned=('__name__','__module__'))
        def f(*args, **kwargs):
            return self.mthd(obj, *args, **kwargs)

        return self.use_parent_doc(f, overridden)

    def get_no_inst(self, cls):

        for parent in cls.__mro__[1:]:
            overridden = getattr(parent, self.name, None)
            if overridden: break

        @wraps(self.mthd, assigned=('__name__','__module__'))
        def f(*args, **kwargs):
            return self.mthd(*args, **kwargs)

        return self.use_parent_doc(f, overridden)

    def use_parent_doc(self, func, source):
        if source is None:
            raise NameError, ("Can't find '%s' in parents"%self.name)
        func.__doc__ = source.__doc__
        return func

doc_inherit = DocInherit 

পিতামাতা শ্রেণীর 'পদ্ধতির ডক্টরসিং উত্তরাধিকারী করার জন্য এটি একটি পদ্ধতি ঝরঝরে। এটি অনেক ক্ষেত্রে কার্যকর হবে বলে আমি মনে করি। আমি পুরো ক্লাসের জন্য ডক্টরসিং সম্পর্কে আরও ভাবছিলাম, যেখানে আমি উত্তরাধিকারী এবং সংযোজন করতে চাই।
ক্রেগ ম্যাককুইন

আহ, গোছা। সেক্ষেত্রে বেশিরভাগ ডক-প্রজন্ম আপনার জন্য ইতিমধ্যে তা করে।
জন ফেমেনিলা

39

আপনি সহজেই ডকাস্ট্রিংগুলিকে একত্রিত করতে পারেন:

class Foo(object):
    """
    Foo Class.
    This class foos around.
    """
    pass

class Bar(Foo):
    """
    Bar class, children of Foo
    Use this when you want to Bar around.
    parent:
    """ 
    __doc__ += Foo.__doc__
    pass

তবে এটি অকেজো। বেশিরভাগ ডকুমেন্টেশন জেনারেশন সরঞ্জাম ( স্পিনক্স এবং ইপিডোক অন্তর্ভুক্ত) ইতিমধ্যে পদ্ধতি সহ প্যারেন্ট ডকস্ট্রিংকে টানবে। সুতরাং আপনাকে কিছু করতে হবে না।


16
প্রকৃতপক্ষে, বেশিরভাগ ডকুমেন্টেশন সরঞ্জামগুলি এটি করে। কিন্তু অন্তর্নির্মিত সহায়তা () ফাংশনটি তা করে না।
মারিওভিলাস

4
@ মারিওভিলাস: সম্ভবত এটি একটি বাগ যা রিপোর্ট করা উচিত?
নট 101

স্পিঙ্কস আমার জন্য এটি করছে বলে মনে হয় না, সম্ভবত আমার পিতামাতাই "ব্যক্তিগত" উফ নামটি আন্ডারস্কোর দিয়ে শুরু হয়।
গ্রিংগো সুভেভ

6

বিশেষভাবে মার্জিত নয়, তবে সহজ এবং সরাসরি:

class X(object):
  """This class has a method foo()."""
  def foo(): pass

class Y(X):
  __doc__ = X.__doc__ + ' Also bar().'
  def bar(): pass

এখন:

>>> print Y.__doc__
This class has a method foo(). Also bar().

আপনি যদি Init docstringএটির জন্যও এটি করতে চান তবে এটির সংজ্ঞা অনুসারে কোনও উপায় আছে কি Y? আমি এটি করতে সক্ষম হয়েছি এমন একমাত্র উপায় হ'ল সংজ্ঞাটি __init__.__doc__ = X.__init__.__doc__ + " Also another param"অনুসরণ করে তবে এটি ফর্ম্যাটিংয়ের সাথে বিশৃঙ্খলা বোধ করে, অতিরিক্ত সংযোজন স্থান তৈরি করে। __init__Y
মিলিগ্রামবার্ট

5

একটি মিশ্র স্টাইল যা উত্তরাধিকারসূত্রে প্রাপ্ত ডাস্ট্রিং সিনট্যাক্স এবং পছন্দসই ক্রম উভয়কেই সংরক্ষণ করতে পারে:

class X(object):
  """This class has a method foo()."""
  def foo(): pass

class Y(X):
  """ Also bar()."""
  __doc__ = X.__doc__ + __doc__
  def bar(): pass

অ্যালেক্সের একই আউটপুট সহ:

>>> print Y.__doc__
This class has a method foo(). Also bar().

পাতলা বরফ: ডাস্ট্রিংয়ের সাথে খেলে আপনার মডিউলটি ব্যবহারযোগ্য হতে পারে না python -OO, কিছু প্রত্যাশা করুন:

TypeError: cannot concatenate 'str' and 'NoneType' objects

5

আমি লিখেছি custom_inherit docstring উত্তরাধিকার পরিচালনা করার জন্য কিছু সহজ, হালকা ওজন সরঞ্জাম প্রদান।

এটি বিভিন্ন ধরণের ডকাস্ট্রিংগুলিকে মার্জ করার জন্য কিছু দুর্দান্ত ডিফল্ট শৈলীর সাথেও আসে (উদাঃ নম্পি, গুগল এবং পুনরায় ফর্ম্যাট করা ডকাস্ট্রিংস)। আপনি খুব সহজেই নিজের স্টাইলটি সরবরাহ করতে পারেন।

ওভারল্যাপিং ডকাস্ট্রিং বিভাগগুলি সন্তানের বিভাগকে পিছিয়ে দেবে, অন্যথায় তারা দুর্দান্ত ফর্ম্যাটিংয়ের সাথে একত্রে একত্রিত হয়।

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