আমার কোন ক্লাস বা অভিধান ব্যবহার করা উচিত?


105

আমার একটি ক্লাস রয়েছে যার মধ্যে কেবল ক্ষেত্র রয়েছে এবং কোনও পদ্ধতি নেই:

class Request(object):

    def __init__(self, environ):
        self.environ = environ
        self.request_method = environ.get('REQUEST_METHOD', None)
        self.url_scheme = environ.get('wsgi.url_scheme', None)
        self.request_uri = wsgiref.util.request_uri(environ)
        self.path = environ.get('PATH_INFO', None)
        # ...

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


4
আমি ডেটা রাখার জন্য সর্বদা অভিধান ব্যবহার করি এবং এটি আমার কাছে ব্যবহারের মতো লাগে। কিছু ক্ষেত্রে ক্লাস নেওয়া থেকে dictবোঝা যায়, করতে পারে। ঝরঝরে সুবিধা: আপনি যখন ডিবাগ করবেন তখন কেবল বলুন print(request)এবং আপনি সহজেই সমস্ত রাজ্যের তথ্য দেখতে পাবেন। আরও ধ্রুপদী পদ্ধতির সাথে আপনাকে আপনার কাস্টম __str__পদ্ধতিগুলি লিখতে হবে , যা আপনাকে যদি সারাক্ষণ এটি করতে হয় তবে সফল হয়।
প্রবাহিত

এগুলি বিনিময়যোগ্য স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি /

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

4
@ রালফ যা ওওপি অজগর সমর্থন করে না?
qwr

উত্তর:


33

আপনি কেন এটি একটি অভিধান করবেন? লাভ কী? আপনি যদি পরে কিছু কোড যুক্ত করতে চান তবে কি হবে? কোথায় তোমার হবে__init__ কোড ?

ক্লাসগুলি সম্পর্কিত ডেটা বান্ডিল করার জন্য (এবং সাধারণত কোড) হয়।

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

এটি একটি ক্লাস রাখুন।


আমি ক্লাসের __init__পদ্ধতির পরিবর্তে ড্যাক তৈরির এক ধরণের কারখানা পদ্ধতি তৈরি করব । তবে আপনি ঠিক বলেছেন: আমি একসাথে থাকা জিনিসগুলিতে পৃথক করে দেব।
deamon

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

4
এটি OBJECT ওরিয়েন্টেড প্রোগ্রামিং এবং ক্লাস ওরিয়েন্টেড কারণে নয়: আমরা বস্তুগুলি নিয়ে কাজ করি। একটি বস্তু 2 (3) বৈশিষ্ট্য দ্বারা চিহ্নিত করা হয়: 1. রাষ্ট্র (সদস্য) 2. আচরণ (পদ্ধতি) এবং 3. উদাহরণ কয়েকটি শব্দে বর্ণনা করা যেতে পারে। সুতরাং ক্লাসগুলি একসাথে রাষ্ট্র এবং আচরণের জন্য বান্ডিল করার জন্য।
ফ্রেন্ডজিস

14
আমি এটিকে চিহ্নিত করেছি কারণ আপনার যেখানে সম্ভব সম্ভব সরল ডেটা কাঠামোতে সর্বদা ডিফল্ট হওয়া উচিত। এক্ষেত্রে একটি অভিধানের উদ্দেশ্যে উদ্দেশ্য যথেষ্ট। প্রশ্ন where would your __init__ code go?সম্পর্কিত। এটি কোনও কম অভিজ্ঞ বিকাশকারীকে বোঝাতে পারে যে কোনও অভিধানে কোনও init পদ্ধতি ব্যবহার না করায় কেবল ক্লাসই ব্যবহার করতে হয়। অ্যাবসার্ড
লয়েড মুর

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

44

আপনার ক্লাসের অতিরিক্ত ব্যবস্থার প্রয়োজন না হলে অভিধান ব্যবহার করুন। namedtupleহাইব্রিড পদ্ধতির জন্য আপনি এটি ব্যবহার করতে পারেন :

>>> from collections import namedtuple
>>> request = namedtuple("Request", "environ request_method url_scheme")
>>> request
<class '__main__.Request'>
>>> request.environ = "foo"
>>> request.environ
'foo'

এখানে পারফরম্যান্সের পার্থক্যগুলি ন্যূনতম হবে, যদিও অভিধানটি দ্রুত না করলে আমি অবাক হব।


15
"এখানে পারফরম্যান্সের পার্থক্যগুলি ন্যূনতম হবে , যদিও অভিধানটি উল্লেখযোগ্যভাবে দ্রুত না করা হলে আমি অবাক হব ।" এটি গণনা করে না। :)
মিপাদি

4
@ মিপাডি: এটি সত্য। এখন ঠিক করা হয়েছে: পি
ক্যাট্রিয়েল

ডিকটি নামডটুপলের চেয়ে 1.5 গুণ দ্রুত এবং স্লট ছাড়াই বর্গের চেয়ে দ্বিগুণ দ্রুত। এই উত্তর আমার পোস্ট দেখুন।
alexpinho98

@ আলেক্সপিনহো ৯৮: আপনি যে পোস্টটি উল্লেখ করছেন তার সন্ধানের জন্য আমি অনেক চেষ্টা করেছি, তবে আমি এটি খুঁজে পাচ্ছি না! আপনি কি ইউআরএল সরবরাহ করতে পারেন? ধন্যবাদ!
ড্যান ওলিংগার 26'15

@ ড্যানোব্লিংগার আমি ধরে নিচ্ছি যে তার নীচের উত্তরটি তার অর্থ।
অ্যাডাম লুইস

37

পাইথন একটি বর্গ হয় একটি অভি নীচে। আপনি শ্রেণি আচরণের সাথে কিছুটা ওভারহেড পান তবে আপনি প্রোফাইলার ছাড়া এটি লক্ষ্য করতে পারবেন না। এই ক্ষেত্রে, আমি বিশ্বাস করি আপনি ক্লাস থেকে উপকৃত হবেন কারণ:

  • আপনার সমস্ত যুক্তি একক ফাংশনে বাস করে
  • এটি আপডেট করা সহজ এবং এনক্যাপসুলেটেড থাকে
  • আপনি যদি পরে কিছু পরিবর্তন করেন তবে আপনি সহজেই ইন্টারফেসটি একই রাখতে পারেন

আপনার সমস্ত যুক্তি একক ফাংশনে বাস করে না। একটি শ্রেণি ভাগ করা রাষ্ট্র এবং সাধারণত এক বা একাধিক পদ্ধতির একটি দ্বিগুণ। আপনি যদি কোনও ক্লাস পরিবর্তন করেন তবে এর ইন্টারফেস সম্পর্কে আপনাকে কোনও গ্যারান্টি দেওয়া হবে না।
লয়েড মুর

25

আমি মনে করি যে প্রতিটিটির ব্যবহার আমার পক্ষে তাতে প্রবেশের পক্ষে খুব বিষয়গত, সুতরাং আমি কেবল সংখ্যায় আটকে থাকব।

আমি ডিক, একটি নতুন_স্টাইল শ্রেণি এবং স্লট সহ একটি নতুন_স্টাইল শ্রেণিতে একটি ভেরিয়েবল তৈরি করতে এবং পরিবর্তন করতে যে সময় লাগে তার সাথে তুলনা করেছি।

এটি পরীক্ষার জন্য আমি যে কোডটি ব্যবহার করেছি তা এখানে (এটি কিছুটা অগোছালো তবে এটি কাজটি করে))

import timeit

class Foo(object):

    def __init__(self):

        self.foo1 = 'test'
        self.foo2 = 'test'
        self.foo3 = 'test'

def create_dict():

    foo_dict = {}
    foo_dict['foo1'] = 'test'
    foo_dict['foo2'] = 'test'
    foo_dict['foo3'] = 'test'

    return foo_dict

class Bar(object):
    __slots__ = ['foo1', 'foo2', 'foo3']

    def __init__(self):

        self.foo1 = 'test'
        self.foo2 = 'test'
        self.foo3 = 'test'

tmit = timeit.timeit

print 'Creating...\n'
print 'Dict: ' + str(tmit('create_dict()', 'from __main__ import create_dict'))
print 'Class: ' + str(tmit('Foo()', 'from __main__ import Foo'))
print 'Class with slots: ' + str(tmit('Bar()', 'from __main__ import Bar'))

print '\nChanging a variable...\n'

print 'Dict: ' + str((tmit('create_dict()[\'foo3\'] = "Changed"', 'from __main__ import create_dict') - tmit('create_dict()', 'from __main__ import create_dict')))
print 'Class: ' + str((tmit('Foo().foo3 = "Changed"', 'from __main__ import Foo') - tmit('Foo()', 'from __main__ import Foo')))
print 'Class with slots: ' + str((tmit('Bar().foo3 = "Changed"', 'from __main__ import Bar') - tmit('Bar()', 'from __main__ import Bar')))

এবং এখানে আউটপুট ...

তৈরি হচ্ছে ...

Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003

একটি পরিবর্তনশীল পরিবর্তন করা হচ্ছে ...

Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142

সুতরাং, যদি আপনি কেবল ভেরিয়েবলগুলি সংরক্ষণ করেন তবে আপনার গতি প্রয়োজন, এবং এটির জন্য আপনাকে অনেকগুলি গণনা করার প্রয়োজন হবে না, আমি ডিক ব্যবহার করার পরামর্শ দিই (আপনি সবসময় কেবল কোনও পদ্ধতির মতো দেখতে একটি ফাংশন তৈরি করতে পারেন)। তবে, যদি আপনার সত্যিই ক্লাসের প্রয়োজন হয় তবে মনে রাখবেন - সর্বদা __ স্লট __ ব্যবহার করুন

বিঃদ্রঃ:

দু'জনের সাথেই 'ক্লাস' টেস্ট করেছি স্টাইল এবং ওল্ড স্টাইল ক্লাস দিয়েই । দেখা যাচ্ছে যে ওল্ড স্টাইলের ক্লাসগুলি তৈরি করা আরও দ্রুত তবে সংশোধন করার জন্য ধীর (যদি আপনি একটি টান লুপে প্রচুর ক্লাস তৈরি করেন তবে তা তাত্পর্যপূর্ণ নয় তবে গুরুত্বপূর্ণ (টিপ: আপনি এটি ভুল করছেন))।

ভেরিয়েবলগুলি তৈরি এবং পরিবর্তন করার সময়গুলি আপনার কম্পিউটারে পৃথক হতে পারে যেহেতু খনিটি পুরানো এবং ধীর। নিশ্চিত হয়ে নিন যে আপনি 'আসল' ফলাফলগুলি দেখতে এটি নিজেই পরীক্ষা করেন।

সম্পাদনা করুন:

পরে আমি নেমটুপলটি পরীক্ষা করেছিলাম: আমি এটিকে পরিবর্তন করতে পারি না তবে 10000 নমুনা তৈরি করতে (বা এর মতো কিছু) লাগে এটিতে 1.4 সেকেন্ড লেগেছিল তাই অভিধানটি প্রকৃতপক্ষে দ্রুততম।

আমি যদি কী এবং মানগুলি অন্তর্ভুক্ত করার জন্য ডিক ফাংশনটি পরিবর্তন করি এবং আমি যখন এটি তৈরি করি ডিকটি যুক্ত ভেরিয়েবলের পরিবর্তে ডিকটি ফিরিয়ে আনি তবে এটি আমাকে 0.8 সেকেন্ডের পরিবর্তে 0.65 দেয়

class Foo(dict):
    pass

তৈরি করা স্লট সহ একটি শ্রেণীর মতো এবং ভেরিয়েবল পরিবর্তন করা সবচেয়ে ধীর (0.17 সেকেন্ড) তাই এই ক্লাসগুলি ব্যবহার করবেন না । ডিক (গতি) বা অবজেক্ট ('সিনট্যাক্স ক্যান্ডি') থেকে প্রাপ্ত ক্লাসের জন্য যান


আমি একটি সাবক্লাসের জন্য নম্বরগুলি দেখতে চাই dict(কোনও ওভাররাইড পদ্ধতি ছাড়া, আমার ধারণা?)। এটি কি নতুন-স্টাইলের শ্রেণীর মতো একইভাবে সম্পাদন করে যা স্ক্র্যাচ থেকে লেখা হয়েছিল?
বেঞ্জামিন হজসন

12

আমি @ এডডাব্লু এর সাথে একমত আমি কখনই অভিধান সহ কোনও "অবজেক্ট" (ওও অর্থে) উপস্থাপন করব না। অভিধানগুলি সামগ্রিক নাম / মান জোড়া। শ্রেণিগুলি বস্তুর প্রতিনিধিত্ব করে। আমি কোড দেখেছি যেখানে শব্দগুলির সাথে বস্তুগুলি প্রতিনিধিত্ব করা হয় এবং জিনিসটির আসল আকৃতিটি কী তা পরিষ্কার নয়। নির্দিষ্ট নাম / মান সেখানে না থাকলে কী হয়? ক্লায়েন্টকে কোনও কিছু puttingোকাতে বাধা দেয় কি না বা কিছু আদৌ পাওয়ার চেষ্টা করে। জিনিসটির আকৃতি সর্বদা পরিষ্কারভাবে সংজ্ঞায়িত করা উচিত।

পাইথন ব্যবহার করার সময় শৃঙ্খলা নিয়ে গড়ে তোলা জরুরি কারণ ভাষা লেখককে তার নিজের পায়ে গুলি করার জন্য বিভিন্ন উপায়ে অনুমতি দেয়।


9
এসও-তে উত্তরগুলি ভোট অনুসারে বাছাই করা হয় এবং একই ভোট গণনা সহ উত্তর এলোমেলোভাবে অর্ডার করা হয়। সুতরাং "শেষ পোস্টার" দ্বারা আপনি কাকে বোঝাতে চাইছেন দয়া করে তা পরিষ্কার করুন।
মাইক ডিসিমোন

4
এবং আপনি কীভাবে জানবেন যে কেবলমাত্র ক্ষেত্র রয়েছে এবং কোনও কার্যকারিতা কোনও ওও অর্থে কোনও "অবজেক্ট" নয়?
মুহাম্মদ আলকারৌরি

4
আমার লিটমাস পরীক্ষাটি "এই ডেটার কাঠামো স্থির?" যদি হ্যাঁ, তবে কোনও বস্তুটি ব্যবহার করুন, অন্যথায় একটি ডিক। এ থেকে প্রস্থান কেবল বিভ্রান্তি তৈরি করতে চলেছে।
weberc2

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

5

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

অতএব, ক্লাসের সাথে লেগে থাকুন।


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

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

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

4

আপনি যা অর্জন করতে চান তার সমস্ত যদি তার obj.bla = 5পরিবর্তে সিনট্যাক্স ক্যান্ডি হয় obj['bla'] = 5, বিশেষত যদি আপনাকে প্রচুর পরিমাণে পুনরাবৃত্তি করতে হয় তবে আপনি সম্ভবত মার্টিনিয়াসের পরামর্শ মতো কিছু সাধারণ পাত্রে ধারক শ্রেণি ব্যবহার করতে চান। তবুও, সেখানে কোডটি বেশ স্ফীত এবং অহেতুক ধীরে ধীরে। আপনি এটিকে সহজ রাখতে পারেন:

class AttrDict(dict):
    """ Syntax candy """
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

namedtupleএস বা একটি শ্রেণিতে স্যুইচ করার আরেকটি কারণ __slots__মেমরির ব্যবহার হতে পারে। ডিক্টগুলির জন্য তালিকার ধরণের চেয়ে উল্লেখযোগ্যভাবে বেশি মেমরির প্রয়োজন হয়, তাই এটি চিন্তা করার মতো বিষয় হতে পারে।

যাইহোক, আপনার নির্দিষ্ট ক্ষেত্রে, আপনার বর্তমান বাস্তবায়ন থেকে সরে যাওয়ার কোনও প্রেরণা বলে মনে হচ্ছে না। আপনি এই লক্ষ লক্ষ বস্তু বজায় রেখেছেন বলে মনে হয় না, সুতরাং কোনও তালিকা-উত্পন্ন-প্রকারের প্রয়োজন নেই। এবং এটি আসলে এর মধ্যে কিছু কার্যকরী যুক্তি ধারণ করে __init__, যাতে আপনারও উচিত হয় না AttrDict


types.SimpleNamespace(পাইথন ৩.৩ থেকে পাওয়া যায়) কাস্টম অ্যাট্রিক্টিক্টের বিকল্প।
ক্রিশ্চিয়ান সিউপিতু

4

আপনার কেক রাখা এবং এটি খাওয়াও সম্ভব। অন্য কথায় আপনি এমন কিছু তৈরি করতে পারেন যা একটি শ্রেণি এবং অভিধান উদাহরণ উভয়ের কার্যকারিতা সরবরাহ করে। ActiveState দেখি Dɪᴄᴛɪᴏɴᴀʀʏ ᴡɪᴛʜ ᴀᴛᴛʀɪʙᴜᴛᴇ-sᴛʏʟᴇ ᴀᴄᴄᴇss রেসিপি এবং যে করছেন উপায়ে মন্তব্য।

আপনি যদি সাবক্লাসের পরিবর্তে একটি নিয়মিত ক্লাস ব্যবহার করার সিদ্ধান্ত নেন তবে আমি এই ধরণের জিনিসটির জন্য খুব নমনীয় এবং দরকারী হতে খুঁজে পেয়েছি (অ্যালেক্স মার্তেলির লিখেছেন) T recipe sɪᴍᴘʟᴇ ʙᴜᴛ ʜᴀɴᴅʏ "ᴄᴏʟʟᴇᴄᴛᴏʀ ᴏғ ᴀ ʙᴜɴᴄʜ ᴏғ ɴᴀᴍᴇᴅ ɴᴀᴍᴇᴅ ɴᴀᴍᴇᴅ ᴛᴜғғ sᴛᴜғғ" recipess রেসিপিটি পেয়েছি দেখে মনে হচ্ছে আপনি করছেন (অর্থাত্ তথ্য সম্পর্কিত একটি আপেক্ষিক সাধারণ সংগ্রহকারী তৈরি করুন)। এটি একটি শ্রেণি হওয়ায় আপনি পদ্ধতিগুলি যুক্ত করে সহজেই এর কার্যকারিতা আরও বাড়িয়ে দিতে পারেন।

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

হালনাগাদ

পাইথন ৩.৩ মডিউলে একটি শ্রেণীর object(যার একটি নেই __dict__) সাবক্লাস নামের SimpleNamespace(যার একটি রয়েছে) যুক্ত করা হয়েছিল typesএবং এটি আরও একটি বিকল্প is


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