পাইথনে ক্লাস সজ্জকার: ব্যবহারিক ব্যবহারের ক্ষেত্রে


9

আমি পাইথন বর্গ সাজসজ্জার ব্যবহারিক এবং অ সিন্থেটিক ব্যবহারের ক্ষেত্রে সন্ধান করছি। এখনও অবধি, আমার কাছে একমাত্র কেসটি প্রকাশক-গ্রাহক সিস্টেমে ক্লাস নিবন্ধকরণ করছে, যেমন প্লাগইন বা ইভেন্ট, এরকম কিছু:

@register
class MyPlugin(Plugin):
    pass

অথবা

@recieves_notifications
class Console:
    def print(self, text):
        ...

অন্য যে কোনও বিবেকবান কেসটির কথা আমি ভাবছিলাম তা উত্তরাধিকার, মেটাক্লাস বা সাজানোর পদ্ধতিতে তৈরি করা যেতে পারে। আপনি কি দয়া করে ক্লাস সাজসজ্জার ব্যবহারের কোনও ভাল (বা খারাপ!) উদাহরণ শেয়ার করতে পারেন?

ধন্যবাদ!


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

@amon যখন একটি মেটাক্লাস একটি পাকা বিকাশকারী দ্বারা ব্যবহৃত হয়, এর সাধারণত অর্থ হয় যে অন্যান্য বিকল্পগুলি পুরোপুরি বিবেচনা করা হয়েছে এবং মেটাকগ্লাস এ পর্যন্ত সমস্যা সমাধানের সেরা উপায়। তদ্ব্যতীত, স্পষ্টতই অন্তর্নিহিতের চেয়ে ভাল - এটি কারণ হতে পারে কারণ (উদাহরণস্বরূপ) আমাদের রয়েছে ABCMeta, @abstractclassশ্রেণিবদ্ধ নয়।
জাউর নাসিবভ

2
আমি একজন পাইথন প্রোগ্রামার এবং আমি সত্যই তাদের প্রয়োজন দেখি না। কোনও ভাষার বৈশিষ্ট্য উপস্থিত থাকার অর্থ এই নয় যে আপনার এটি ব্যবহার করতে হবে বা এমনকি করা উচিত। ডিজাইনাররা সমস্ত ধরণের পাগল বৈশিষ্ট্য নিয়ে আসে যা অনিচ্ছাকৃত বা এমনকি দৃষ্টিশক্তি সহকারে ক্ষতিকারক হয়ে থাকে। প্রকৃতপক্ষে, আপনি আপনার প্রশ্নে এইরকম আরও দুটি বৈশিষ্ট্য উল্লেখ করেছেন :)
উদ্যান

1
আমি ছাড়া বাঁচতে পারি না এমন কিছু মনে করি না, তবে যেটি আমার কাছে দরকারী বলে মনে হয়েছিল তা হ'ল শ্রেণীর সমস্ত পদ্ধতিগুলির ইনপুট এবং আউটপুটগুলিতে লগ করতে ক্লাস ডেকোরেটর ব্যবহার করা।
বিগুসাচ

উত্তর:


8

ইউনিট টেস্টগুলি লেখার সময় @unittest.skipIfএবং @unittest.skipUnlessপৃথক পদ্ধতিতে বা একটি সম্পূর্ণ unittest.TestCaseশ্রেণীর সংজ্ঞাতে ব্যবহার করা যেতে পারে । এটি প্ল্যাটফর্ম নির্দিষ্ট সমস্যার জন্য পরীক্ষাগুলি লিখতে এত সহজ করে তোলে।

থেকে উদাহরণ asyncio/test_selectors

# Some platforms don't define the select.kqueue object for these tests.
# On those platforms, this entire grouping of tests will be skipped.

@unittest.skipUnless(hasattr(selectors, 'KqueueSelector'),
                 "Test needs selectors.KqueueSelector)")
class KqueueSelectorTestCase(BaseSelectorTestCase, ScalableSelectorMixIn):
...

2

ক্লাস সাজসজ্জাগুলি স্পষ্টভাবে এমন কিছু জিনিস তৈরি করার জন্য তৈরি করা হয়েছিল যা ইতিমধ্যে মেটাক্লাসগুলির মাধ্যমে প্রকাশযোগ্য ছিল পিইপি থেকে :

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


PEP-3129 উদ্ধৃত করার জন্য ধন্যবাদ। তবে প্রশ্নটি শ্রেণি সাজসজ্জার কেন বিদ্যমান, গুডো তাদের সম্পর্কে কী চিন্তা করে এবং জপ বা আয়রন পাইথন তাদের উত্থানের আগে কীভাবে এগুলি ব্যবহার করতে পারত সে সম্পর্কে নয়। প্রশ্নটি তাদের ব্যবহারিক ব্যবহার সম্পর্কে আজ,
২০১

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

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

1

থেকে এই স্ট্যাক ওভারফ্লো প্রশ্ন:

def singleton(class_):
  instances = {}
  def getinstance(*args, **kwargs):
    if class_ not in instances:
        instances[class_] = class_(*args, **kwargs)
    return instances[class_]
  return getinstance

@singleton
class MyClass(BaseClass):
  pass

হ্যাঁ, তবে একই এসও প্রশ্নে বৈপরীত্যটি সঠিকভাবে দেওয়া হয়েছে: মেটাক্লাস একটি আরও ভাল পদ্ধতির।
জাউর নাসিবভ

1

ব্যবহারের ক্ষেত্রে যে শ্রেণীর উপর টেকনিক দিয়ে করা যাবে জন্যে বৃথা - কিছু যে শ্রেণীর উপর টেকনিক দিয়ে করা যাবে metaclasses সঙ্গে সম্পন্ন করা যেতে পারে। এমনকি আপনার নিবন্ধনের উদাহরণ। এটি প্রমাণ করার জন্য, এখানে একটি মেটাক্লাস রয়েছে যা ডেকরেটারকে প্রয়োগ করে:

পাইথন 2:

def register(target):
    print 'Registring', target
    return target


class ApplyDecorator(type):
    def __new__(mcs, name, bases, attrs):
        decorator = attrs.pop('_decorator')
        cls = type(name, bases, attrs)
        return decorator(cls)

    def __init__(cls, name, bases, attrs, decorator=None):
        super().__init__(name, bases, attrs)


class Foo:
    __metaclass__ = ApplyDecorator
    _decorator = register

পাইথন 3:

def register(target):
    print('Registring', target)
    return target


class ApplyDecorator(type):
    def __new__(mcs, name, bases, attrs, decorator):
        cls = type(name, bases, attrs)
        return decorator(cls)

    def __init__(cls, name, bases, attrs):
        super().__init__(name, bases, attrs)


class Foo(metaclass=ApplyDecorator, decorator=register):
    pass

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