পাইথন ৩.x এ পাইথনের অবজেক্ট থেকে উত্তরাধিকারী হওয়া কি দরকারী বা দরকারী?


94

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

নতুন সংস্করণ (> 3.0 এবং 2.6) সম্পর্কে কী? আমি ক্লাস অবজেক্ট সম্পর্কে গুগল করেছিলাম তবে আমি এত ফলাফল পেয়েছি (একটি স্পষ্ট কারণে) কোন ইঙ্গিত?

ধন্যবাদ!


4
যদি আপনার কোডটি ২.x এরও অধীনে ব্যবহার করা হয় তবে তা স্পষ্ট করে বলা ভাল।
smci

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

উত্তর:


94

objectঅজগর 3 এ আপনার নতুন স্টাইল তৈরি হতে হবে না ।


4
লক্ষ্য করুন যে এর অর্থ সকল শ্রেণি objectনির্বিশেষে উত্তরাধিকার সূত্রে উত্তরাধিকার সূত্রে টাইপ করলে (object)না পাইথন ৩.১
u0b34a0f6ae

8
আপনার দরকার নেই, তবে "পাইথন 3 তে পাইথন কোডটি পোর্টিং 3" বলছে যে এটি এখনও বৈধ : ডকস.পিথন.আর। …
হাইপারবোরিয়ান

এনজেইকের মন্তব্যে উল্লিখিত এই পোস্টটি থেকে পুরানো স্টাইল বনাম নতুন স্টাইলে (কেবল পাই 2 এর সাথে সত্যিই প্রাসঙ্গিক) একটি ভাল স্থিতিশীল রেফারেন্সের মতো মনে হচ্ছে: ডকস.পিথন.অর্গ / 2 / রেফারেন্স /… - উপরের লিঙ্কগুলি মনে হয়েছে পরিবর্তিত হয়েছে।
এরিক কাজিনো

80

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

আপনি যদি স্পষ্টতই উত্তরাধিকার সূত্রে উত্তরাধিকারী হন তবে আপনি objectআসলে যা করছেন তা সেই সময়ে কী নির্দেশ করে তা নির্বিশেষে উত্তরাধিকার সূত্রে প্রাপ্ত builtins.object

অতএব, আমার কিছু (খুব ভৌতিক) মডিউল থাকতে পারে যা কোনও কারণে অবজেক্টকে ওভাররাইড করে। আমরা এই প্রথম মডিউলটিকে "newobj.py" বলব:

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

তারপরে অন্য কয়েকটি ফাইলে ("ক্লাস.পি"):

class Greeter(object):
    pass

class NonGreeter:
    pass

তারপরে তৃতীয় একটি ফাইলে (যা আমরা আসলে চালাতে পারি):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

সুতরাং আপনি দেখতে পাচ্ছেন যে, যেখানে বিষয়টি স্পষ্টভাবে বস্তু থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে, সেখানে আপনি যেহেতু অন্তর্নিহিত উত্তরাধিকারের অনুমতি দিচ্ছেন তার চেয়ে আমরা আলাদা আচরণ পাই।


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