স্থির পদ্ধতি - অন্য পদ্ধতি থেকে কোনও পদ্ধতিকে কল করতে কীভাবে?


98

যখন ক্লাসে অন্য পদ্ধতি কল করার জন্য আমার নিয়মিত পদ্ধতি থাকে, তখন আমাকে এটি করতে হয়

class test:
    def __init__(self):
        pass
    def dosomething(self):
        print "do something"
        self.dosomethingelse()
    def dosomethingelse(self):
        print "do something else"

কিন্তু যখন আমার স্থির পদ্ধতি থাকে তখন আমি লিখতে পারি না

self.dosomethingelse()

কারণ কোন উদাহরণ নেই। একই ক্লাসের অন্য একটি স্ট্যাটিক পদ্ধতি থেকে স্ট্যাটিক পদ্ধতি কল করার জন্য পাইথনে আমাকে কীভাবে করতে হবে?

সম্পাদনা: কি গোলমাল। ঠিক আছে, আমি মূল প্রশ্নটিতে প্রশ্নটি সম্পাদনা করেছি। পিটার হ্যানসেনের মন্তব্যে থাকা দ্বিতীয় প্রশ্নের উত্তর আমার কাছে ইতিমধ্যে আছে। আপনি যদি ভাবেন যে আমার কাছে ইতিমধ্যে থাকা উত্তরের জন্য আমার আরও একটি প্রশ্ন খোলার উচিত, প্লিজ আমাকে বলুন।


4
@ পাবলো: আপনি প্রশ্নের সারমর্ম পরিবর্তন করতে পারবেন না !! এই প্রশ্নটি শেষ করুন এবং অন্য একটি শুরু করুন !!
jldupont

ঠিক আছে ঠিক আছে. আপনি কি প্রশ্ন মুছতে চান? উত্তর ইতিমধ্যে পিটার হ্যানসেনের মন্তব্যে রয়েছে
পাবলো 14

@ পাবলো: আপনি এখানে মুছতে পারবেন না যা আপনার প্রশ্নের জবাব অবদানকারী প্রত্যেকের পক্ষে নম্র হবে না। আপনার একটি উত্তর গ্রহণ করতে হবে এবং একটি নতুন প্রশ্ন তৈরি করতে হবে।
jldupont

4
@ পাবলো: এবং স্পষ্ট করে বলার জন্য: আপনার মূল প্রশ্ন গঠনের জন্য একটি উত্তর গ্রহণ করা উচিত । চিন্তা করবেন না, আপনি এখানে প্রায় আপনার উপায় শিখতে হবে। চিয়ার্স :-)
jldupont

উত্তর:


80

class.method কাজ করা উচিত.

class SomeClass:
  @classmethod
  def some_class_method(cls):
    pass

  @staticmethod
  def some_static_method():
    pass

SomeClass.some_class_method()
SomeClass.some_static_method()

17
পরামর্শ এখানে যুক্ত করা উচিত: এটি স্পষ্ট যে শ্রেণিবদ্ধদের স্ট্যাটিকমেথডসের তুলনায় কোনও ত্রুটি নেই এবং শ্রেণিবদ্ধরা ভবিষ্যতে অন্য শ্রেণীর পদ্ধতিগুলি কল করার পদ্ধতিটিকে প্রসারিত করতে দেয়। তাত্ক্ষণিক প্রয়োজন না থাকলেও এটি সর্বদা পছন্দ করা উচিত।
u0b34a0f6ae

4
@ u0b34a0f6ae: আমি জানি না আমি ভাল কিছু করছি কি না ... তবে আমি ক্লাসের অভ্যন্তরে সজ্জা নির্ধারণ করেছি। সাজসজ্জারকে "শ্রেণিবদ্ধ" না হয়ে "স্ট্যাটিকমিথড" হতে হয়েছিল।
আন্দ্রে কলডাস

@ u0b34a0f6ae শ্রেণিবদ্ধরা কি সর্বদা থ্রেড নিরাপদ? আমার ব্যবহারের ক্ষেত্রে আমি ক্লাসে দুর্ঘটনাজনিত অ্যাক্সেস রোধ করতে থ্রেডগুলিতে স্ট্যাটিকমিথড ব্যবহার করছি যা থ্রেড নিরাপদ নাও হতে পারে।
অ্যাকভিটা

@ u0b34a0f6ae সর্বদা কিছুটা শক্ত। উদাহরণস্বরূপ PySpark স্ট্যাটিকমেথডস ব্যবহার করে rdd জব ব্যবহার করা যেতে পারে এবং ক্লাসমেডথগুলি পারবেন না।
লরেন্স কোপ্পেনল

141

একই ক্লাসের অন্য একটি স্ট্যাটিক পদ্ধতি থেকে স্ট্যাটিক পদ্ধতি কল করার জন্য পাইথনে আমাকে কীভাবে করতে হবে?

class Test() :
    @staticmethod
    def static_method_to_call()
        pass

    @staticmethod
    def another_static_method() :
        Test.static_method_to_call()

    @classmethod
    def another_class_method(cls) :
        cls.static_method_to_call()

কলটি Test.static_method_to_call()এই শ্রেণীর অন্যান্য অ-স্থিতিশীল এবং অ-শ্রেণীর পদ্ধতি থেকে কাজ করা উচিত, তাই না? (... এবং সম্ভবত অন্যান্য ক্লাসগুলিও?)
gr4nt3d

হ্যাঁ, Test.static_method_to_call()যে কোনও জায়গা থেকে কাজ করবে।
ওয়ারওয়ারিয়াক

11

দ্রষ্টব্য - দেখে মনে হচ্ছে প্রশ্নটি কিছু পরিবর্তন হয়েছে। স্ট্যাটিক পদ্ধতি থেকে আপনি কীভাবে উদাহরণ পদ্ধতিকে কল করবেন এই প্রশ্নের উত্তর হ'ল আপনি কোনও যুক্তি হিসাবে তদন্ত বা স্ট্যাটিক পদ্ধতির অভ্যন্তরে ইনস্ট্যান্ট না করেই পারবেন না।

নিম্নলিখিতটি "বেশিরভাগ স্থিতিশীল পদ্ধতি থেকে আপনি কীভাবে একটি স্ট্যাটিক পদ্ধতিটিকে কল করবেন" এর উত্তর দেওয়ার জন্য বেশিরভাগ ক্ষেত্রে:

মনে রাখবেন যে হয় স্ট্যাটিক পদ্ধতি এবং পাইথন মধ্যে বর্গ পদ্ধতিগুলির মধ্যে একটি পার্থক্য। একটি স্থিতিশীল পদ্ধতি কোনও অন্তর্নিহিত প্রথম যুক্তি নেয় না, যখন একটি শ্রেণি পদ্ধতি ক্লাসটিকে অন্তর্নিহিত প্রথম আর্গুমেন্ট হিসাবে গ্রহণ করে (সাধারণত সাধারণত)cls কনভেনশন দ্বারা) হিসাবে গ্রহণ করে। এই বিষয়টি মনে রেখে, আপনি কীভাবে তা করবেন তা এখানে:

যদি এটি একটি স্থির পদ্ধতি:

test.dosomethingelse()

যদি এটি একটি শ্রেণিবদ্ধ পদ্ধতি:

cls.dosomethingelse()

4
আপনি কেবল cls.dosomethingelse()শ্রেণির সংজ্ঞা থেকেই ব্যবহার করতে পারেন ।
jldupont

4
আরও নির্ভুল হতে, আপনি কেবল cls.dosomethingelse()ক্লাসের পদ্ধতি থেকেই ব্যবহার করতে পারেন । ঠিক যেমন আপনি কেবল selfএকটি উদাহরণ পদ্ধতির মধ্যে থেকে ব্যবহার করতে পারেন ।
জেসন বেকার

4
দুঃখিত, আমি ভুলভাবে প্রশ্ন লিখেছি। বাহ! আমি লিখতে চেয়েছিলাম "একই ক্লাসের অন্য একটি স্ট্যাটিক পদ্ধতি থেকে উদাহরণ পদ্ধতি কল করার জন্য পাইথনে আমাকে কীভাবে করতে হবে" এবং না "একই স্ট্যাটিক পদ্ধতি থেকে স্ট্যাটিক পদ্ধতি কল করার জন্য পাইথনে আমাকে কীভাবে করতে হবে? শ্রেণী "
পাবলো

@ পাবলো: এক্ষেত্রে আপনার আর একটি প্রশ্ন লিখতে হবে এবং এটি শেষ করতে হবে।
jldupont

@ জাল্ডুপন্ট, আমার কাছে ইতিমধ্যে উত্তর আছে তবে একটি মন্তব্যে। আমি কী করব কারণ আমি তা গ্রহণ করতে পারি না তবে প্রশ্নটি মুছে ফেলার অপচয় হবে না?
পাবলো 14

4

ক্লাস পদ্ধতি এবং স্থির পদ্ধতির মধ্যে প্রধান পার্থক্য ঠিক আছে:

  • ক্লাস পদ্ধতির নিজস্ব পরিচয় রয়েছে, এ কারণেই তাদের একটি ইনস্ট্যান্সের মধ্যে থেকে ডাকতে হবে।
  • অন্যদিকে স্থিতিশীল পদ্ধতিটি একাধিক উদাহরণের মধ্যে ভাগ করা যায় যাতে এটি অবশ্যই শ্রেণীর মধ্যে থেকে কল করা উচিত

এটি সঠিক বলে মনে হচ্ছে না - তবে এখানে অর্থ উদাহরণ ছাড়াই অস্পষ্ট, তাই এটি বলা শক্ত। মূলত, "শ্রেণীর পদ্ধতিগুলিকে" "উদাহরণের মধ্যে থেকে" ডাকতে হবে না ... আপনি MyClass.class_method()যে কোনও জায়গা থেকে কল করতে পারেন যা সম্পর্কে জানেন MyClass(সম্ভবত আপনি "উদাহরণের পদ্ধতিগুলি" সম্পর্কে ভাবছিলেন?)
mltsy

1

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

সঠিক উত্তরটি প্রশ্নযুক্ত কোডের ব্যবহারের ক্ষেত্রে নির্ভর করবে;) উপভোগ করুন


0

আপনি স্থির পদ্ধতি থেকে অ স্থির পদ্ধতি কল করতে পারবেন না তবে স্থির পদ্ধতির অভ্যন্তরে একটি উদাহরণ তৈরি করে .... এটি এর মতো কাজ করা উচিত

class test2(object):
    def __init__(self):
        pass

    @staticmethod
    def dosomething():
        print "do something"
        #creating an instance to be able to call dosomethingelse(),or you may use any existing instace
        a=test2()
        a.dosomethingelse()

    def dosomethingelse(self):
        print "do something else"

test2.dosomething()

আশা করি যে আপনাকে সাহায্য করবে :)


4
আইএমও এই পদ্ধতিটি কেবল @classmethodআপনার পদ্ধতিগুলি ঘোষণা করার জন্য এবং এর cls.dosomethingelse()মধ্যে ব্যবহারের cls.dosomething()চেয়ে খারাপ - উভয় পারফরম্যান্সের ক্ষেত্রে আরও খারাপ (কেবল স্থিতিশীল পদ্ধতিতে অ্যাক্সেস পেতে অবজেক্টগুলি ইনস্ট্যান্ট করে তোলা) এবং পঠনযোগ্যতা (এটি সোজা নয়, এবং আমি কল্পনা করি যে যদি এই ধরণের নিদর্শনটির বয়লারপ্লেটে পরিণত হয়েছে, নিখুঁত কোনও মানুষের পার্স করা পুরো কোডবেস বেশ কঠিন হয়ে উঠতে পারে)
কাইল ওয়াইল্ড

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