পাইথনে একটি বেস ক্লাসের ক্লাসমেড ফোন করছে


105

নিম্নলিখিত কোড বিবেচনা করুন:

class Base(object):

    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do(a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

> $ python play.py  
> In derived! 
> <class '__main__.Base'> msg

থেকে Derived.do, আমি কিভাবে ফোন করব Base.do?

আমি সাধারণত superবা বেস ক্লাসের নামটি সরাসরি ব্যবহার করতে পারি যদি এটি একটি সাধারণ অবজেক্ট পদ্ধতি হয় তবে স্পষ্টতই আমি বেস শ্রেণিতে শ্রেণিবদ্ধকে ফোন করার কোনও উপায় খুঁজে পাই না।

উপরের উদাহরণে ক্লাসের পরিবর্তে ক্লাস Base.do(a)প্রিন্ট করে ।BaseDerived


উত্তর:


121

যদি আপনি একটি নতুন-স্টাইলের ক্লাস ব্যবহার করেন (যেমন objectপাইথন 2 থেকে এসেছে , বা সর্বদা পাইথন 3-এ রয়েছে) তবে আপনি এটির super()মতো করে এটি করতে পারেন :

super(Derived, cls).do(a)

এইভাবেই আপনি কোডটি ভিত্তিক শ্রেণীর সংস্করণে পদ্ধতির (যেমন print cls, a) উত্পন্ন শ্রেণি থেকে প্রাপ্ত, উত্পন্ন শ্রেণীর সাথে clsসেট করার সাথে অনুরোধ করবেন ।


8
আহ উহ .. আমার কাছে কখনই আসেনি যে আমিও superশ্রেণিবদ্ধদের উপর ব্যবহার করতে পারি ।
শ্রীধর রত্নাকুমার

এটি কেবলমাত্র (সুপার দ্বারা আরোপিত একটি সীমাবদ্ধতার কারণে) কাজ করে যদি বেসটি বস্তু থেকে প্রাপ্ত হয়, তাই না? যদি না হয় আপনি কি করবেন?
আরস-লংগা-ভিটা-ব্রাভিস

হ্যাঁ, এটি কেবলমাত্র নতুন স্টাইলের ক্লাসগুলির জন্য কাজ করে, যা থেকে প্রাপ্ত object। (কমপক্ষে পাইথন 2 এ, তবে পাই 3 এ আমি মনে করি সমস্ত ক্লাসগুলি নতুন ধাঁচের, আইআইআরসি) অন্যথায় আপনাকে করতে হবে Base.do(self, ...), আমার মনে হয়, এর ফলে সুপারক্লাসটির নাম কঠোরভাবে কোডিং করা উচিত।
ডেভিড জেড

ভিতরে Derived.do(), clsএকই হিসাবে না Derived?
রায়

@ রায় যদি এটি প্রকৃতপক্ষে Derivedতবে কোনও সাবক্লাসের নয় তবে হ্যাঁ।
ডেভিড জেড

15

এটি একটি সময় হয়েছে, কিন্তু আমি মনে করি আমি একটি উত্তর খুঁজে পেতে পারে। শ্রেণিবদ্ধ হওয়ার জন্য আপনি যখন কোনও পদ্ধতি সাজান তখন মূল আনবাউন্ড পদ্ধতিটি 'im_func' নামে একটি সম্পত্তিতে সংরক্ষণ করা হয়:

class Base(object):
    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do.im_func(cls, a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

2
দ্রষ্টব্য: এই পদ্ধতিটি পুরানো স্টাইলের ক্লাসগুলির জন্য কাজ করে যেখানে সুপার () কাজ করে না
অ্যালেক্স কিউ

2
__func__পাইথন ২.7 এবং 3
তেও

-3

এটি আমার পক্ষে কাজ করে:

Base.do('hi')

9
clsযুক্তি তারপর বাধ্য হবে Baseপরিবর্তেDerived
শ্রীধর Ratnakumar

আমার জন্য যা কাজ করে তা হ'ল - যা নেডের উত্তরের মতো দেখতে (অনেকটা): যেখানে কিউগ্রাফিক্সভিউ থেকে নিজের প্রাপ্তি রয়েছে যার পেইন্টইভেন্ট (কিউপেন্টভেন্ট) ডিফ পেইন্টইভেন্ট (স্ব, কুইন্টেন্ট) রয়েছে: মুদ্রণ দির (স্ব) কিউগ্রাফিক্সভিউ.পেইন্টইভেন্ট (স্ব, কিউপিএনটিউভেন্ট)
ব্যবহারকারী 192127
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.