পাইথন ক্লাস বস্তুর উত্তরাধিকার সূত্রে প্রাপ্ত


1238

শ্রেণি ঘোষণার উত্তরাধিকারী হওয়ার কি কোনও কারণ আছে object?

আমি সবেমাত্র এমন কিছু কোড পেয়েছি যা এটি করে এবং এর কোনও ভাল কারণ খুঁজে পাচ্ছি না।

class MyClass(object):
    # class code follows...

2
এটি একটি নতুন ধাঁচের ক্লাস তৈরি করে ।
স্লাকস

115
এই প্রশ্নের উত্তর (সহজ হলেও) খুঁজে পাওয়া বেশ কঠিন। "পাইথন অবজেক্ট বেস ক্লাস" বা এর মতো গুগলিংয়ের বিষয়গুলি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের পৃষ্ঠা এবং টিউটোরিয়ালগুলির পৃষ্ঠা সহ আসে। Upvoting কারণ এই প্রথম লিঙ্ক আছে যা আমাকে খঁোজা নেতৃত্বে হয় "পুরাতন বনাম নতুন স্টাইলের পাইথন বস্তু"
vastlysuperiorman

উত্তর:


761

শ্রেণি ঘোষণার উত্তরাধিকারী হওয়ার কি কোনও কারণ আছে object?

পাইথন 3-তে পাইথন 2 এবং 3 এর মধ্যে সামঞ্জস্যতা ছাড়াও কোনও কারণ নেই । পাইথন 2 এ, অনেকগুলি কারণ


পাইথন 2.x গল্প:

পাইথন ২.x-এ (২.২ থেকে পরবর্তী) objectবেস-ক্লাস হিসাবে উপস্থিতি বা অনুপস্থিতির উপর নির্ভর করে ক্লাসগুলির দুটি স্টাইল রয়েছে :

  1. "ক্লাসিক" স্টাইলের ক্লাস: তাদের objectবেস ক্লাস হিসাবে নেই:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "নতুন" স্টাইলের ক্লাসগুলি: তাদের বেস বা ক্লাস হিসাবে প্রত্যক্ষ বা অপ্রত্যক্ষভাবে (যেমন একটি বিল্ট-ইন টাইপের উত্তরাধিকারী ) রয়েছে object:

    >>> class NewSpam(object):           # directly inherit from object
    ...    pass
    >>> NewSpam.__bases__
    (<type 'object'>,)
    >>> class IntSpam(int):              # indirectly inherit from object...
    ...    pass
    >>> IntSpam.__bases__
    (<type 'int'>,) 
    >>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
    (<type 'object'>,)
    

কোনও সন্দেহ নেই, কোনও ক্লাস লেখার সময় আপনি সর্বদা নতুন-স্টাইলের ক্লাসে যেতে চাইবেন। এগুলি করার অনুমতিগুলি অসংখ্য, তাদের কয়েকটি তালিকাবদ্ধ করার জন্য:

  • বর্ণনাকারী জন্য সমর্থন । বিশেষত, বর্ণনাকারীদের দ্বারা নিম্নলিখিত নির্মাণগুলি সম্ভব হয়েছে:

    1. classmethod: এমন একটি পদ্ধতি যা ক্লাসটিকে উদাহরণের পরিবর্তে অন্তর্নিহিত যুক্তি হিসাবে গ্রহণ করে।
    2. staticmethod: এমন একটি পদ্ধতি যা selfপ্রথম যুক্তি হিসাবে অন্তর্নিহিত যুক্তি পায় না ।
    3. এর সাথে বৈশিষ্ট্যগুলি property: কোনও বৈশিষ্ট্য অর্জন, সেটিংস এবং মুছতে পরিচালনার জন্য ফাংশন তৈরি করুন।
    4. __slots__: একটি শ্রেণীর মেমরির কনসপশনগুলি সংরক্ষণ করে এবং দ্রুত অ্যাট্রিবিউট অ্যাক্সেসের ফলাফলও দেয়। অবশ্যই, এটি সীমাবদ্ধতা আরোপ করে না ।
  • __new__স্ট্যাটিক পদ্ধতি: আপনি কাস্টমাইজ নতুন বর্গ দৃষ্টান্ত নির্মিত দেয়।

  • পদ্ধতি সমাধানের আদেশ (এমআরও) : কোন পদ্ধতিতে কল করতে হবে তা সমাধান করার চেষ্টা করার সময় কোন শ্রেণীর বেস শ্রেণিগুলি কী আদেশে অনুসন্ধান করা হবে।

  • এমআরও সম্পর্কিত, superকলগুলি । এছাড়াও, দেখুন super()সুপার বিবেচিত।

আপনি যদি উত্তরাধিকারসূত্রে না হন তবে objectএগুলি ভুলে যান। "নতুন" স্টাইলের ক্লাসের অন্যান্য পার্কগুলির সাথে আগের বুলেট পয়েন্টগুলির আরও বিশদ বিবরণ এখানে পাওয়া যাবে

নতুন-স্টাইলের ক্লাসগুলির একটি ডাউনসাইড হ'ল ক্লাসটি নিজেই বেশি মেমরির দাবি করে। যদিও আপনি অনেকগুলি শ্রেণি অবজেক্ট তৈরি না করেন, তবে আমি সন্দেহ করি এটি একটি সমস্যা হবে এবং এটি ইতিবাচক সমুদ্রে নেতিবাচক ডুবেছে।


পাইথন 3.x গল্প:

পাইথন 3 এ, জিনিসগুলি সরল করা হয়েছে। কেবলমাত্র নতুন-স্টাইলের ক্লাস রয়েছে (ক্লাস হিসাবে ক্লাস হিসাবে উল্লেখ করা হয়) সুতরাং যুক্ত করার objectক্ষেত্রে কেবলমাত্র পার্থক্য আপনাকে আরও 8 টি অক্ষর টাইপ করতে হবে। এই:

class ClassicSpam:
    pass

সম্পূর্ণ সমতুল্য (তাদের নাম :-) বাদে এটি:

class NewSpam(object):
     pass

এবং এটি:

class Spam():
    pass

সব objectতাদের আছে __bases__

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]

তাহলে এখন তোমার কি করা উচিত?

পাইথন 2 এ: সর্বদা objectসুস্পষ্টভাবে উত্তরাধিকারী হন । পারফেসস পান

পাইথন 3: উত্তরাধিকারী থেকে objectআপনি কোড লেখা হয় চেষ্টা পাইথন অজ্ঞেয়বাদী হতে, যে, এটা পাইথন 2 এবং পাইথন 3. উভয় কাজ করার প্রয়োজন তা না হলে না, এটা সত্যিই কোন পার্থক্য যেহেতু পাইথন এটা আপনার জন্য সন্নিবেশ তোলে না দৃশ্যের অন্তরালে.


"বেস-ক্লাস হিসাবে বিল্ট-ইন টাইপের উপস্থিতি বা অনুপস্থিতির উপর নির্ভর করে" => আসলে এটি "বেস ক্লাস হিসাবে বিল্টিন টাইপের উপস্থিতি বা উপস্থিতি" সম্পর্কে নয় তবে শ্রেণীর উত্তরাধিকার সূত্রে - প্রত্যক্ষ বা পরোক্ষভাবে - থেকে object। আইআইআরসি সময়ে একটা পয়েন্ট ছিল যেখানে সমস্ত বিল্টিন ধরণের নয় যেখানে এখনও নতুন স্টাইলের ক্লাসে পোর্ট করা হয়েছে।
ব্রুনো ডেথুইলিয়ার্স 15 '35

@ ব্রুনোডেসথুইলিয়ার্স আমার ধারণাটি ছিল যে সমস্ত অন্তর্নির্মিত প্রকারগুলি উত্তরাধিকার সূত্রে পায় object। আমার কাছে পাইথনটি প্রায় ২.২.৩ রয়েছে এবং দ্রুত চেক করার পরে আমি কোনও অপরাধীকে খুঁজে পেলাম না, তবে উত্তরটি পরে আরও স্পষ্ট করে লিখব। আগ্রহী হবেন যদি আপনি উদাহরণটি খুঁজে পেতে পারেন তবে, আমার কৌতূহল শঙ্কিত।
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড 20'18

সমস্ত সততার সাথে (আমার পূর্ববর্তী মন্তব্যে "আইআইআরসি" সিএফ) আমি এই পয়েন্টটি সম্পর্কে 101% নিশ্চিত নই (নতুন স্টাইলের ক্লাস চালু হওয়ার সাথে সাথে সমস্ত বিল্টিন টাইপগুলি ইতিমধ্যে নতুন-স্টাইলের ক্লাসে রূপান্তরিত হয়েছিল) - আমি সম্ভবত সরল হতে পারি ভুল, বা এটি কেবল স্ট্যান্ডার্ড লিবের (তবে বিল্টিন নয়) ধরণের কয়েকটি সম্পর্কে উদ্বিগ্ন হতে পারে। তবে তবুও আমি মনে করি এটি স্পষ্ট করে বলা উচিত যে একটি নতুন-শৈলীর শ্রেণি কী objectকরে এটির ঘাঁটিতে রয়েছে।
ব্রুনো ডেথুইলিয়ার্স

7
খুব খারাপ স্ট্যাকওভারফ্লো কেবল এই ধরণের উত্তরগুলির জন্য আপভোট = আপভোট + 1 করে, ইচ্ছে করে আমি
upvote

1
staticmethodএবং classmethodপুরানো-শৈলীর ক্লাসেও ঠিক কাজ করে। propertyবাছাই পুরাতন স্টাইলের ক্লাসগুলিতে পড়ার জন্য কাজ করে, এটি কেবল লেখাগুলিকে বাধা দিতে ব্যর্থ হয় (সুতরাং আপনি যদি নামটি অর্পণ করেন, উদাহরণটি প্রদত্ত নামের একটি বৈশিষ্ট্য অর্জন করে যা সম্পত্তিটির ছায়া দেয়)। এছাড়াও নোট করুন যে __slots__অ্যাক্সেসের গতিতে অ্যাট্রিবিউটের উন্নতি হ'ল মূলত নতুন শৈলীর শ্রেণীর অ্যাট্রিবিউট অ্যাক্সেসের ক্ষতিটি পূর্বাবস্থায় ফিরিয়ে আনার বিষয়ে, সুতরাং এটি সত্যই নতুন শৈলীর শ্রেণীর বিক্রয় কেন্দ্র নয় (মেমরি সঞ্চয় যদিও বিক্রয়ের পয়েন্ট)।
শ্যাডোর্যাঞ্জার

540

পাইথন ঘ

  • class MyClass(object): = নতুন স্টাইলের ক্লাস
  • class MyClass:= নতুন স্টাইলের ক্লাস (এর থেকে স্পষ্টত উত্তরাধিকার সূত্রে প্রাপ্ত object)

পাইথন 2

  • class MyClass(object): = নতুন স্টাইলের ক্লাস
  • class MyClass:= পুরানো স্টাইল শ্রেণি

ব্যাখ্যা :

পাইথন 3.x এ বেস ক্লাসগুলি সংজ্ঞায়িত করার সময়, আপনাকে objectসংজ্ঞা থেকে ড্রপ করার অনুমতি দেওয়া হয় । তবে, এটি সমস্যাটিকে ট্র্যাক করার জন্য মারাত্মক শক্তির জন্য দরজাটি খুলতে পারে…

পাইথন নতুন স্টাইলের ক্লাসগুলি পাইথন ২.২ এ ফিরে এসেছিল এবং এখন অবধি প্রাচীন স্টাইলের ক্লাসগুলি বেশ পুরানো হয়ে গেছে। পুরানো স্টাইলের ক্লাসগুলির আলোচনাটি 2.x ডক্সে সমাধিস্থ করা হয়েছে এবং 3.x ডক্সে নেই non

সমস্যাটি হচ্ছে, পাইথন ২.x এর পুরানো-শৈলিক শ্রেণীর জন্য বাক্য গঠনটি পাইথন ৩.x নতুন স্টাইলের ক্লাসগুলির বিকল্প সিনট্যাক্সের মতো । পাইথন ২.x এখনও বহুল ব্যবহৃত হয় (উদাঃ জিএই, ওয়েব টুপি) এবং যে কোনও কোড (বা কোডার) অজান্তেই ২.x কোডে ৩.x-স্টাইলের শ্রেণি সংজ্ঞা আনছে কিছু মারাত্মক পুরানো বেস অবজেক্টের সাথে শেষ হতে চলেছে। এবং যেহেতু পুরাতন স্টাইলের ক্লাসগুলি কারও রাডারে নেই, তারা সম্ভবত বুঝতে পারে না যে তাদের কী আঘাত করেছে।

সুতরাং কেবল এটিকে দীর্ঘ পথ বানান এবং কিছু 2.x বিকাশকারীকে অশ্রুগুলি সঞ্চয় করুন।


13
"পাইথন ৩.x এর বেস ক্লাসগুলি সংজ্ঞায়িত করার সময় আপনাকে সংজ্ঞাটি থেকে অবজেক্টটি ফেলে দেওয়ার অনুমতি দেওয়া হয়েছে। তবে সমস্যাটি ট্র্যাক করার জন্য এটি গুরুতর শক্তির জন্য দরজা উন্মুক্ত করতে পারে ..." আপনি কোন সমস্যার কথা উল্লেখ করছেন?
এইডিস

6
@ এডিস: আমি মনে করি যে তারা বোঝায় যে পি 2 এবং পাই 3 উভয়টিতে চলমান কোড পাই 3 এ জরিমানা হবে তবে এটি যদি নতুন-শৈলীর শ্রেণীর বৈশিষ্ট্যগুলিতে নির্ভর করে তবে পাই 2 তে নষ্ট হয়ে যাবে। ব্যক্তিগতভাবে, আমি যদি এর মতো কোড লিখছি তবে আমি সুস্পষ্ট উত্তরাধিকারটি বাদ দিয়ে কেবল __metaclass__ = typeমডিউলের শীর্ষে রেখেছি ( from __future__ import absolute_import, division, print_functionলাইনের পরে :-)); এটি পাই 2 এর একটি সামঞ্জস্যতা হ্যাক যা মডিউলটিকে পরবর্তীকালে সংজ্ঞায়িত শ্রেণিগুলি ডিফল্টরূপে নতুন স্টাইলে তৈরি করে এবং পাই 3 এ এটি সম্পূর্ণ উপেক্ষা করা হয় (কেবলমাত্র একটি এলোমেলো বৈশ্বিক পরিবর্তনশীল বসে আছে), সুতরাং এটি নিরীহ।
শ্যাডোএ্যাঞ্জার

400

হ্যাঁ, এটি একটি 'নতুন স্টাইল' অবজেক্ট। এটি পাইথন ২.২ এ উপস্থাপন করা একটি বৈশিষ্ট্য ছিল।

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

পার্থক্যের বিবরণের জন্য এসও লিঙ্ক: পাইথনের পুরাতন স্টাইল এবং নতুন স্টাইলের ক্লাসগুলির মধ্যে পার্থক্য কী?


110
এটি +1 নোট করুন যে পুরাতন স্টাইলের ক্লাসগুলি পাইথন 3 এ চলে গেছে, সুতরাং আপনাকে কেবল objectপাইথন 2 এ উত্তরাধিকারী হওয়া দরকার

9
এটি আসল উত্তর নয়। ı কেবল অন্য নিবন্ধগুলিতে রেফারেন্স দেয়। আমি মনে করি ইয়ারিনের উত্তর এই প্রশ্নের উত্তর হিসাবে গ্রহণ করা উচিত।
alwbtc

2
@ অ্যালববিটিসি: এই উত্তরেও নতুন কিছু রয়েছে। উদাহরণস্বরূপ "সুপার ()" এর উল্লেখ আমাকে অন্য একটি গুরুত্বপূর্ণ স্থানে নিয়ে গেছে [এখানে] ( স্ট্যাকওভারফ্লো / প্রশ্ন / 5761616969 / / )।
ভাইফায়

34

পাইথন থেকে হার্ড ওয়ে শিখুন ইতিহাস :

পাইথনের ক্লাসের মূল উপস্থাপনাটি অনেক মারাত্মক উপায়ে ভেঙে যায়। এই ত্রুটিটি সনাক্ত হওয়ার সময় এটি ইতিমধ্যে অনেক দেরি হয়ে গেছে এবং তাদের এটি সমর্থন করতে হয়েছিল। সমস্যাটি সমাধান করার জন্য তাদের কিছু "নতুন শ্রেণি" শৈলীর প্রয়োজন ছিল যাতে "পুরাতন শ্রেণিগুলি" কাজ করে যেতে পারে তবে আপনি নতুন আরও সঠিক সংস্করণটি ব্যবহার করতে পারেন।

তারা সিদ্ধান্ত নিয়েছে যে ক্লাস তৈরির জন্য আপনি উত্তরাধিকার সূত্রে প্রাপ্ত "শ্রেণি" হতে তারা নিম্নবিত্ত একটি শব্দ "অবজেক্ট" ব্যবহার করবে। এটি বিভ্রান্তিকর, তবে একটি শ্রেণি বর্গ তৈরির জন্য "অবজেক্ট" নামে শ্রেণীর উত্তরাধিকার সূত্রে আসে তবে এটি কোনও বস্তু আসলে তার শ্রেণি নয়, তবে অবজেক্ট থেকে উত্তরাধিকারী হতে ভুলবেন না।

নতুন স্টাইলের ক্লাস এবং পুরানো স্টাইলের ক্লাসগুলির মধ্যে পার্থক্য কী তা কেবল আপনাকে জানাতেই, নতুন স্টাইলের ক্লাসগুলি সর্বদা ক্লাস থেকে objectবা অন্য শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় object:

class NewStyle(object):
    pass

আরেকটি উদাহরণ হ'ল:

class AnotherExampleOfNewStyle(NewStyle):
    pass

একটি পুরানো-শৈলীর বেস শ্রেণীর মতো দেখতে:

class OldStyle():
    pass

এবং একটি পুরাতন স্টাইলের শিশু শ্রেণিটি এরকম দেখাচ্ছে:

class OldStyleSubclass(OldStyle):
    pass

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


8
রুট ক্লাসকে কল করা objectসব বিভ্রান্তিকর নয় এবং বাস্তবে এটি বেশ মানক। স্মল্টালকের একটি মূল শ্রেণি রয়েছে Object, এবং একটি মূল মেটাক্লাসের নাম রয়েছে Class। কেন? কারণ, যেমন Dogকুকুরের Objectজন্য একটি শ্রেণি, বস্তুর জন্য একটি শ্রেণি, এবং Classশ্রেণীর জন্য একটি শ্রেণি class জাভা, সি #, ওবিজেসি, রুবি এবং অন্যান্য শ্রেণিভিত্তিক ওও ভাষাগুলি যেগুলি আজ মানুষ ব্যবহার করে যার মূল শ্রেণি রয়েছে Objectকেবল পাইথন নয়, নামের কিছুটা প্রকরণ ব্যবহার করে।
অবতারিত

30

হ্যাঁ, এটি .তিহাসিক । এটি ছাড়া এটি একটি পুরানো ধাঁচের শ্রেণি তৈরি করে।

আপনি যদি type()কোনও পুরানো স্টাইলের অবজেক্টে ব্যবহার করেন তবে আপনি কেবল "উদাহরণ" পাবেন। একটি নতুন স্টাইলের অবজেক্টে আপনি এর ক্লাস পাবেন।


এছাড়াও, আপনি যদি type()কোনও পুরানো শৈলীর ক্লাসে ব্যবহার করেন তবে আপনি "টাইপ" এর পরিবর্তে "শ্রেণীবজ" পাবেন।
জোয়েল সেজগ্রেন

7

শ্রেণি তৈরির বিবৃতিটির বাক্য গঠন:

class <ClassName>(superclass):
    #code follows

আপনি বিশেষত যে কোনও সুপারক্লাসের উত্তরাধিকারী হতে চান তার অভাবে, superclassসর্বদা হওয়া উচিত object, যা পাইথনের সমস্ত শ্রেণির মূল।

objectপ্রযুক্তিগতভাবে পাইথনের "নতুন ধাঁচের" শ্রেণির মূল। তবে নতুন স্টাইলের ক্লাসগুলি আজ ক্লাসের একমাত্র শৈলী হওয়ার মতোই দুর্দান্ত।

তবে, objectক্লাস তৈরি করার সময় আপনি যদি শব্দটি স্পষ্টভাবে ব্যবহার না করেন , তবে অন্যরা যেমন উল্লেখ করেছেন, পাইথন ৩.x স্পষ্টতই objectসুপারক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত । তবে আমি অনুমান করি সুস্পষ্টতা সর্বদা অন্তর্নিহিতের চেয়ে ভাল (নরক)

উল্লেখ

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