সমস্ত পাইথন ক্লাসে কি বস্তু বাড়ানো উচিত?


129

আমি খুঁজে পেয়েছি যে নিম্নলিখিত দুটি কাজ:

class Foo():
    def a(self):
        print "hello"

class Foo(object):
    def a(self):
        print "hello"

সমস্ত পাইথন ক্লাসে কি বস্তু বাড়ানো উচিত? অবজেক্ট অব অবজেক্টে কোনও সম্ভাব্য সমস্যা আছে কি?


2
তার মাঝে একটি পার্থক্য আছে কি class Foo():এবং class Foo:? আমি পাইথন মান্য হিসেবে কাজ উভয় 3.
উলফ

: এটা ভাল এই প্রশ্নের উত্তর হচ্ছে stackoverflow.com/questions/4015417/...
nngeek

উত্তর:


117

পাইথন 2-এ উত্তরাধিকার সূত্রে প্রাপ্ত না হওয়ায় objectএকটি পুরানো শৈলীর শ্রেণি তৈরি হবে, যা অন্যান্য প্রভাবগুলির মধ্যেও typeবিভিন্ন ফলাফল দেয়:

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>

বনাম

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>

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

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


68

পাইথন 3-এ, objectআপনি নিজেরাই বলছেন বা না বলুন , ক্লাসগুলি সুস্পষ্টভাবে প্রসারিত হয়েছে ।

পাইথন 2 এ, পুরানো-শৈলীর এবং নতুন-শৈলীর ক্লাস রয়েছে। কোনও শ্রেণিকে সিগন্যাল করতে নতুন-স্টাইল হয়, আপনাকে এখান থেকে স্পষ্টতই উত্তরাধিকার সূত্রে উত্তীর্ণ হতে হবে object। যদি তা না হয় তবে পুরানো শৈলীর প্রয়োগ ব্যবহার করা হয়।

আপনি সাধারণত একটি নতুন-স্টাইলের ক্লাস চান। objectস্পষ্টতই উত্তরাধিকারী । দ্রষ্টব্য যে এটি পাইথন 3 কোডের ক্ষেত্রেও প্রযোজ্য যা লক্ষ্য পাইথন 2 এর সাথে সামঞ্জস্যপূর্ণ হতে পারে।


হ্যাঁ, পার্থক্য ফ্রি ফু দেখিয়েছেন , চলে গেছে, বিটিডাব্লু: খালি বন্ধনী কী optionচ্ছিক?
ওল্ফ

4
অজগর 3 কোড রয়েছে যা foo (অবজেক্ট) ব্যবহার করে: এটি কি কেবল তখন একটি সম্মেলন?
RFV5s

2
@ আরএফভেন্টার এটি কোড হতে পারে যা পাইথন 2 এবং 3 উভয়েরই অধীনে চলবে বলে মনে হচ্ছে, ক্লাসটি পাইথন 2 এর অধীনে শ্রেণীর বৃহত্তরভাবে একই আচরণ করার জন্য আপনাকে স্পষ্টভাবে সাবক্লাস অবজেক্টের প্রয়োজন হবে
ব্লুবারডিবলুব

@ ব্লুবার্ডিব্লুব এটিই আমার সন্দেহ হয়েছিল তবে আমাদের প্রকল্পটি একচেটিয়াভাবে পাইথন ৩.৫ ভার্চুয়ালেনভে চলছে। আমি মনে করি কোডটি অবশ্যই একটি অজগর 2 প্রকল্প থেকে অনুলিপি করা হয়েছিল।
আরএফভি

@ আরএফভেন্টার হ্যাঁ, এটি অন্য ব্যাখ্যা হতে পারে। এবং অবশ্যই, যদি এটি এখনই পাইথন 3.x হয় তবে অবজেক্টের রেফারেন্সগুলি থেকে মুক্তি পাওয়া ভাল।
blubberdiblub

17

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

উদাহরণ 1।

class MyClass:
 pass

উদাহরণ 2।

class MyClass():
 pass

উদাহরণ 3।

class MyClass(object):
  pass

1
এটি কঠোরভাবে সত্য নয় ... স্ট্যাকওভারফ্লো
ফিলিপ অ্যাডলার

আমি নিশ্চিত যে আমি আপনাকে অনুসরণ করছি। এবং হ্যাঁ, এটি সম্ভবত প্রাসঙ্গিক না হওয়া পর্যন্ত বেশিরভাগ লোকের কাছেই প্রাসঙ্গিক নয়।
ফিলিপ অ্যাডলার

@ ফিলিপএডলার এটি সাধারণত অনুমান করা হয় যা objectঅন্তর্নির্মিত রেফারেন্স দেয় object। যদি আমাদের অবশ্যই সিপিথনের অন্তর্নির্মিত শনাক্তকারী প্রতিস্থাপন করা যায় তা বিবেচনা করা উচিত আমরা ডেটা মডেল সম্পর্কে সবেমাত্র কিছু দৃ .়তার সাথে বলতে পারি। এটি কি গুরুত্ব সহকারে যুক্তিযুক্ত হতে পারে যে strএকটি যুক্তি হিসাবে সর্বদা একটি স্ট্রিংকে আর্গুমেন্ট হিসাবে গ্রহণ করে না builtins.str = None?
নুনো আন্দ্রে

আমি এই দাবীটি দেখতে পাচ্ছি যে এটি "বিস্তৃতভাবে ধরে নেওয়া", এবং আমি স্বীকার করি যে এটি প্রতিটি ধারণার দ্বারা অনুবর্তন করা হয় (এটি ভাষার প্রয়োজন হয় না), পাইথন প্রোগ্রামারদের বেশিরভাগই আমার অভিজ্ঞতা হয় নি I এটি অনুমানের সাথে মিলিত হয়েছে, এটি সম্পর্কে জানুন, বা এটি বিবেচনা করেছেন। যা-ই হোক না কেন, এটি দৃ commonly়রূপে দৃ ass়ভাবে বলা হয় যে এটি সাধারণত অনুমান করা হয়, এমনকি সত্য হলেও এটি আমার সমালোচনাটিকে অকার্যকর করে না যে সমতাটি কঠোরভাবে সত্য নয়।
ফিলিপ অ্যাডলার

1

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


1
হুবহু, প্রযুক্তিগতভাবে যদি আপনি না হন তবে আপনি একটি ক্লাসিক ক্লাস পাবেন তবে এর কোনও আসল সুবিধা নেই এবং এটি পাইথন 3 দ্বারা সমর্থিত নয়
সর্বাধিক কে।

এটি পাইথন 3 এর সাথে কেন সামঞ্জস্যতা বাড়ায় তা সম্পর্কে আমি আগ্রহী। আমার বোঝার জন্য, পাইথন 3 এটি স্বয়ংক্রিয়ভাবে বস্তু প্রসারিত করবে এমনকি আপনি যদি এটি নির্দিষ্ট না করেন, তাই না?
পল লো

2
@ পললো রাইট, তবে আপনি যদি স্পষ্টভাবে বস্তু থেকে উত্তরাধিকার সূত্রে পান তবে পাইথন 2 এবং পাইথন 3 উভয় ক্ষেত্রেই আপনি একই (নতুন ধাঁচের) আচরণ পাবেন Py পাইথন 3 কীভাবে কাজ করে তা পরিবর্তনের বিষয় নয়, এটি এগিয়ে ব্যবহার করার বিষয় পাইথন ২
সামঞ্জস্যতা

এই পরামর্শটি খুব মার্জিত বলে মনে হচ্ছে না, তবে আপনি পাইথন 2 এবং পাইথন 3 এর ঠিকানা দিলে এটি কার্যকর বলে মনে হয়। তবে বাস্তবে এটি কতটা প্রাসঙ্গিক?
ওল্ফ

@ ওল্ফ আপনি যা করছেন তার উপর এটি নির্ভর করে। আপনার যদি উত্তরাধিকারসূত্রে জটিল গাছ থাকে তবে তা বেশ গুরুত্বপূর্ণ। আপনি যদি চান যে আপনার শ্রেণি বর্ণনাকারী হতে পারে, আপনাকে নতুন স্টাইল ব্যবহার করতে হবে। আপনি যদি আরও গভীরতার তথ্য চান তবে আপনি স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / ৫৮৮67//২ থেকে লিঙ্কগুলি অনুসরণ করতে পারেন।
পাইডসাইনার

1

অন্যান্য উত্তরগুলি কভার হিসাবে, পাইথন 3 বস্তু থেকে উত্তরাধিকার অন্তর্ভুক্ত। তবে আপনার কী করা উচিত এবং কনভেনশন কী তা তারা জানায় না।

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

class Foo:
    pass

সূত্র: https://docs.python.org/3/tutorial/class.html#class-objects

উদাহরণ উদ্ধৃতি:

শ্রেণীর অবজেক্ট দুটি ধরণের ক্রিয়াকলাপ সমর্থন করে: গুণাবলী উল্লেখ এবং তাত্ক্ষণিক।

অ্যাট্রিবিউট রেফারেন্সগুলি পাইথনের সমস্ত অ্যাট্রিবিউট রেফারেন্সের জন্য ব্যবহৃত স্ট্যান্ডার্ড সিনট্যাক্স ব্যবহার করে: obj.name। শ্রেণীর অবজেক্ট তৈরি হওয়ার সময় বৈধ বৈশিষ্ট্যের নামগুলি সমস্ত নাম যা শ্রেণীর নামস্থানে ছিল in সুতরাং, ক্লাস সংজ্ঞাটি যদি এরকম দেখায়:

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

আরেকটি উক্তি:

সাধারণভাবে বলতে গেলে, দৃষ্টান্তের ভেরিয়েবলগুলি প্রতিটি উদাহরণের জন্য স্বতন্ত্র ডেটার জন্য এবং শ্রেণি ভেরিয়েবলগুলি শ্রেণীর সমস্ত উদাহরণগুলির দ্বারা ভাগ করা বৈশিষ্ট্য এবং পদ্ধতিগুলির জন্য:

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

0

পাইথন 3-তে কোনও পার্থক্য নেই, তবে পাইথন 2-তে প্রসারিত না করা objectআপনাকে একটি পুরানো স্টাইলের ক্লাস দেয়; আপনি একটি পুরানো স্টাইলের ক্লাসের চেয়ে একটি নতুন-স্টাইলের ক্লাস ব্যবহার করতে চান।


2
এই উত্তরটি যুক্তিসঙ্গত, তবে অন্যান্য উত্তরদাতারা দ্রুত এবং / বা আরও ভালভাবে সেখানে পেলেন; এই উত্তরটি পৃষ্ঠাটিতে যেমন কোনও মান যুক্ত করছে না।
মার্ক আমেরিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.