python - @Classmethod এবং শিক্ষার জন্য @ স্ট্যাটিকমিথ মানে?




oop static-methods (8)

কেউ কি আমাকে @staticmethod @classmethod এবং @staticmethod এর অর্থ ব্যাখ্যা করতে পারে? আমি পার্থক্য এবং অর্থ জানতে হবে।

যতদূর আমি বুঝতে পারি, @classmethod পদ্ধতি একটি ক্লাস বলে যে এটি একটি পদ্ধতি যা উপশ্রেণী, বা কিছু ... যাইহোক, এর কি বিন্দু? @ @classmethod বা @staticmethod বা কোন @ সংজ্ঞাগুলি ব্যতীত ক্লাস পদ্ধতিটি ঠিক না কেন?

tl; dr: আমি কখন তাদের ব্যবহার করব, আমি কেন তাদের ব্যবহার করব, এবং কিভাবে তাদের ব্যবহার করব?

আমি সি ++ এর সাথে বেশ উন্নত, তাই আরো উন্নত প্রোগ্রামিং ধারণা ব্যবহার করা উচিত নয়। যদি সম্ভব হয় তাহলে আমাকে একটি অনুরূপ C ++ উদাহরণ দিন।


@classmethod এবং @staticmethod @classmethod @staticmethod ?

  • একটি পদ্ধতি একটি বস্তুর নামপাসে একটি ফাংশন যা একটি বৈশিষ্ট্য হিসাবে অ্যাক্সেসযোগ্য।
  • একটি নিয়মিত (অর্থাত্) পদ্ধতিটি অন্তর্নিহিত প্রথম যুক্তি হিসাবে উদাহরণ (আমরা সাধারণত এটি কল) পায়।
  • একটি শ্রেণি পদ্ধতি শ্রেণীকে (আমরা সাধারণত এটি cls কল) হিসাবে অন্তর্নিহিত প্রথম যুক্তি হিসাবে পায়।
  • একটি স্ট্যাটিক পদ্ধতি কোন অন্তর্নিহিত প্রথম যুক্তি (একটি নিয়মিত ফাংশন মত) পায়।

কখন তাদের ব্যবহার করা উচিত, আমি কেন তাদের ব্যবহার করব, এবং কিভাবে তাদের ব্যবহার করব?

আপনি হয় না সাজসজ্জা প্রয়োজন । কিন্তু এই নীতির ভিত্তিতে আপনাকে কার্যকারিতার সংখ্যাগুলি কমাতে হবে (পরিচ্ছন্ন কোডার দেখুন), তারা এটি করার জন্য উপকারী।

class Example(object):

    def regular_instance_method(self):
        """A function of an instance has access to every attribute of that 
        instance, including its class (and its attributes.)
        Not accepting at least one argument is a TypeError.
        Not understanding the semantics of that argument is a user error.
        """
        return some_function_f(self)

    @classmethod
    def a_class_method(cls):
        """A function of a class has access to every attribute of the class.
        Not accepting at least one argument is a TypeError.
        Not understanding the semantics of that argument is a user error.
        """
        return some_function_g(cls)

    @staticmethod
    def a_static_method():
        """A static method has no information about instances or classes
        unless explicitly given. It just lives in the class (and thus its 
        instances') namespace.
        """
        return some_function_h()

উভয় ইনস্ট্যান্স পদ্ধতি এবং ক্লাস পদ্ধতিগুলির জন্য, অন্তত একটি আর্গুমেন্ট গ্রহণ করা হয় না একটি TypeError, তবে সেই যুক্তিটির সেমেটিক্স বুঝতে না একটি ব্যবহারকারী ত্রুটি।

( some_function সংজ্ঞা some_function , উদাহরণস্বরূপ:

some_function_h = some_function_g = some_function_f = lambda x=None: x

এবং এই কাজ করবে।)

দৃষ্টান্ত এবং ক্লাসে ডotted লুকান:

একটি উদাহরণে একটি বিন্দু বর্ণন এই ক্রম সঞ্চালিত হয় - আমরা সন্ধান করি:

  1. ক্লাস নামস্থান একটি তথ্য বর্ণনাকারী (একটি সম্পত্তি মত)
  2. উদাহরণ __dict__ উদাহরণ
  3. ক্লাস নামস্থান (পদ্ধতি) একটি অ-তথ্য বর্ণনাকারী।

নোট, একটি দৃষ্টান্ত একটি বিন্দু বর্ণন এই মত আহ্বান করা হয়:

instance = Example()
instance.regular_instance_method 

এবং পদ্ধতি কল যোগ্য গুণাবলী:

instance.regular_instance_method()

উদাহরণ পদ্ধতি

যুক্তি, self , implicitly বিন্দু বর্ণিত মাধ্যমে দেওয়া হয়।

আপনি ক্লাসের দৃষ্টান্ত থেকে ইনস্ট্যান্স পদ্ধতি অ্যাক্সেস করতে হবে।

>>> instance = Example()
>>> instance.regular_instance_method()
<__main__.Example object at 0x00000000399524E0>

ক্লাস পদ্ধতি

যুক্তি, cls , implicitly বিন্দু বর্ণিত মাধ্যমে দেওয়া হয়।

আপনি একটি ইনস্ট্যান্স বা বর্গ (বা উপশ্রেণী) মাধ্যমে এই পদ্ধতি অ্যাক্সেস করতে পারেন।

>>> instance.a_class_method()
<class '__main__.Example'>
>>> Example.a_class_method()
<class '__main__.Example'>

স্ট্যাটিক পদ্ধতি

কোন আর্গুমেন্ট implicitly দেওয়া হয়। এই পদ্ধতিটি কোনও ফাংশন সংজ্ঞায়িত (উদাহরণস্বরূপ) একটি মডিউলগুলির নামস্থানতে কাজ করে, এটির উপরে নজর দেওয়া ছাড়া

>>> print(instance.a_static_method())
None

আবার, কখন তাদের ব্যবহার করা উচিত, কেন আমি তাদের ব্যবহার করা উচিত?

এইগুলির প্রত্যেকটি ক্রমবর্ধমান পদ্ধতিতে আরও বিধিনিষেধযুক্ত যা তারা পদ্ধতির বনাম পদ্ধতিগুলি পাস করে।

যখন আপনি তথ্য প্রয়োজন না তাদের ব্যবহার করুন।

এই আপনার ফাংশন এবং পদ্ধতি সহজ এবং unittest সম্পর্কে কারণ করে তোলে।

কোন কারণ সম্পর্কে সহজ?

def function(x, y, z): ...

অথবা

def function(y, z): ...

অথবা

def function(z): ...

কম আর্গুমেন্ট সঙ্গে ফাংশন সম্পর্কে কারণ সহজ। তারা একত্রিত করা সহজ।

এই উদাহরণস্বরূপ, বর্গ, এবং স্ট্যাটিক পদ্ধতি অনুরূপ। মনে রাখবেন যে আমাদের একটি দৃষ্টান্ত আছে, তখনও আমাদের ক্লাস আছে, আবার নিজেকে জিজ্ঞাসা করুন, যা যুক্তিযুক্ত ?:

def an_instance_method(self, arg, kwarg=None):
    cls = type(self)             # Also has the class of instance!
    ...

@classmethod
def a_class_method(cls, arg, kwarg=None):
    ...

@staticmethod
def a_static_method(arg, kwarg=None):
    ...

অন্তর্নির্মিত উদাহরণ

এখানে আমার প্রিয় নির্মিত উদাহরণ কয়েকটি:

str.maketrans স্ট্যাটিক পদ্ধতিটি string মডিউলে একটি ফাংশন ছিল, তবে এটি str নামমন্ত্রীর থেকে অ্যাক্সেসযোগ্য হওয়ার জন্য আরও বেশি সুবিধাজনক।

>>> 'abc'.translate(str.maketrans({'a': 'b'}))
'bbc'

dict.fromkeys ক্লাস পদ্ধতি একটি নতুন dict.fromkeys তাত্ক্ষণিক কীগুলির মাধ্যমে তাত্ক্ষণিকভাবে ফেরত পাঠায়:

>>> dict.fromkeys('abc')
{'a': None, 'c': None, 'b': None}

যখন শ্রেণীবিন্যাস করা হয়, তখন আমরা দেখতে পাই যে এটি শ্রেণিবদ্ধ শ্রেণী হিসাবে শ্রেণিবদ্ধ তথ্য পায় যা খুবই উপকারী:

>>> class MyDict(dict): pass
>>> type(MyDict.fromkeys('abc'))
<class '__main__.MyDict'> 

আমার পরামর্শ - উপসংহার

যখন আপনি ক্লাস বা ইনস্ট্যান্স আর্গুমেন্টগুলির প্রয়োজন হয় না তখন স্ট্যাটিক পদ্ধতিগুলি ব্যবহার করুন, তবে ফাংশনটি বস্তুর ব্যবহারের সাথে সম্পর্কিত, এবং ফাংশনটির জন্য বস্তুর নামস্থানতে এটি সুবিধাজনক।

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


প্রতিটি ব্যবহার করার সময়

@staticmethod ফাংশন একটি বর্গের ভিতরে সংজ্ঞায়িত ফাংশন ছাড়া আর কিছুই নয়। এটা প্রথম ক্লাস তাত্ক্ষণিক ছাড়া callable হয়। এটা সংজ্ঞা উত্তরাধিকার মাধ্যমে অপরিবর্তনীয়।

  • পাইথন বস্তুর জন্য একটি আবদ্ধ পদ্ধতি তাত্ক্ষণিক করতে হবে না।
  • এটি কোডটির পঠনযোগ্যতা সহজ করে: @ স্ট্যাটিকমিথটি দেখে, আমরা জানি যে পদ্ধতিটি বস্তুর স্থিতির উপর নির্ভর করে না;

@classmethod ফাংশনটি ক্লাসটি তাত্ক্ষণিকভাবে কল করার @classmethod নয়, তবে তার সংজ্ঞা সাব ক্লাসের মাধ্যমে, সাবস্ক্রাসের মাধ্যমে, সাবস্ক্রাসের অনুসরণ করে, প্যারেন্ট ক্লাস নয়। যেহেতু @classmethod ফাংশনের প্রথম যুক্তি সর্বদা cls (class) হতে হবে।

  • ফ্যাক্টরী পদ্ধতি , উদাহরণস্বরূপ ব্যবহার করার জন্য একটি ক্লাসের জন্য একটি উদাহরণ তৈরি করতে ব্যবহৃত হয় উদাহরণস্বরূপ প্রাক প্রক্রিয়াকরণ।
  • স্ট্যাটিক পদ্ধতিগুলি স্ট্যাটিক পদ্ধতিগুলিকে কল করে : যদি আপনি বিভিন্ন স্ট্যাটিক পদ্ধতিতে স্ট্যাটিক পদ্ধতিগুলি বিভক্ত করেন তবে আপনাকে ক্লাসের নাম হার্ড-কোড করতে হবে না তবে ক্লাস পদ্ধতিগুলি ব্যবহার করতে হবে

here এই বিষয়ে ভাল লিঙ্ক।


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

  • @staticmethod পদ্ধতির প্রথম পরামিতি হিসাবে স্ব বা cls ​​প্রয়োজন হয় না
  • @staticmethod @classmethod @staticmethod এবং @classmethod @staticmethod @classmethod মোড়ানো ফাংশনটি উদাহরণস্বরূপ বা ক্লাস পরিবর্তনশীল দ্বারা বলা যেতে পারে
  • @staticmethod সজ্জিত ফাংশনটি কিছু ধরনের 'অপরিবর্তনীয় সম্পত্তি' প্রভাবকে প্রভাবিত করে যে উপশ্রেণী উত্তরাধিকারটি তার বেস ক্লাস ফাংশনকে ওভাররাইট করতে পারে না যা @staticmethod সজ্জাকারী দ্বারা আবৃত থাকে।
  • @classmethod প্রয়োজন (ক্লাস নাম, আপনি যদি পরিবর্তনশীল নামটি পরিবর্তন করতে পারেন তবে আপনি এটি পছন্দ করতে পারেন তবে ফাংশনের প্রথম প্যারামিটার হিসাবে)
  • @classmethod সর্বদা উপশ্রেণী শ্রেণী দ্বারা ব্যবহৃত হয়, উপশ্রেণী উত্তরাধিকার বেস বর্গ ফাংশনের প্রভাব পরিবর্তন করতে পারে, অর্থাৎ @classmethod মোড়ানো বেস ক্লাস ফাংশনটি বিভিন্ন উপশ্রেণীগুলির দ্বারা ওভাররাইট করা যেতে পারে।

এক @classmethod ব্যবহার @classmethod যখন সে পদ্ধতির আচরণ পরিবর্তন করতে চায় যার উপর সাবক্লাস পদ্ধতিটি কল করছে। মনে রাখবেন আমরা একটি ক্লাস পদ্ধতিতে কলিং ক্লাসের একটি রেফারেন্স আছে।

স্ট্যাটিক ব্যবহারের সময় আপনি আচরণ subclasses জুড়ে অপরিবর্তিত থাকা চাই

উদাহরণ:

class Hero:

  @staticmethod
  def say_hello():
     print("Helllo...")

  @classmethod
  def say_class_hello(cls):
     if(cls.__name__=="HeroSon"):
        print("Hi Kido")
     elif(cls.__name__=="HeroDaughter"):
        print("Hi Princess")

class HeroSon(Hero):
  def say_son_hello(self):
     print("test  hello")



class HeroDaughter(Hero):
  def say_daughter_hello(self):
     print("test  hello daughter")


testson = HeroSon()

testson.say_class_hello() #Output: "Hi Kido"

testson.say_hello() #Outputs: "Helllo..."

testdaughter = HeroDaughter()

testdaughter.say_class_hello() #Outputs: "Hi Princess"

testdaughter.say_hello() #Outputs: "Helllo..."

ক্লাস পদ্ধতি ক্লাস শ্রেণিকে সংশোধন করতে পারে, এটি বর্গের সাথে আবদ্ধ এবং এতে প্যারামিটার হিসাবে ক্লেস থাকে।

স্ট্যাটিক পদ্ধতি ক্লাসের শ্রেণীটিকে সংশোধন করতে পারে না, এটি বর্গটিকে আবদ্ধ করে এবং এটি শ্রেণী বা দৃষ্টান্তকে জানে না

class empDetails:
    def __init__(self,name,sal):
        self.name=name
        self.sal=sal
    @classmethod
    def increment(cls,name,none):
        return cls('yarramsetti',6000 + 500)
    @staticmethod
    def salChecking(sal):
        return sal > 6000

emp1=empDetails('durga prasad',6000)
emp2=empDetails.increment('yarramsetti',100)
# output is 'durga prasad'
print emp1.name
# output put is 6000
print emp1.sal
# output is 6500,because it change the sal variable
print emp2.sal
# output is 'yarramsetti' it change the state of name variable
print emp2.name
# output is True, because ,it change the state of sal variable
print empDetails.salChecking(6500)

যদিও classmethod এবং staticmethod বেশ অনুরূপ, উভয় সত্তাগুলির ব্যবহারের ক্ষেত্রে সামান্য পার্থক্য রয়েছে: classmethod অবশ্যই প্রথম প্যারামিটার হিসাবে ক্লাস অবজেক্টের একটি রেফারেন্স classmethod হবে, তবে staticmethod কোনও পরামিতি থাকতে পারে না।

উদাহরণ

class Date(object):

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

    @staticmethod
    def is_date_valid(date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 3999

date2 = Date.from_string('11-09-2012')
is_date = Date.is_date_valid('11-09-2012')

ব্যাখ্যা

আসুন একটি ক্লাসের একটি উদাহরণ অনুমান করি, তারিখ সম্পর্কিত তথ্য নিয়ে আলোচনা করা (এটি আমাদের বয়লারপ্লেট হবে):

class Date(object):

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

এই ক্লাসটি স্পষ্টভাবে নির্দিষ্ট তারিখগুলি সম্পর্কে তথ্য সংরক্ষণ করতে ব্যবহার করা যেতে পারে (টাইমজোন তথ্য ব্যতীত; আসুন আমরা সব তারিখগুলি ইউটিসিতে উপস্থাপিত হব)।

এখানে আমাদের __init__ , পাইথন ক্লাসের উদাহরণগুলির একটি সাধারণ প্রারম্ভিক, যা একটি সাধারণ instancemethod হিসাবে আর্গুমেন্টগুলি গ্রহণ করে, যার মধ্যে প্রথম অ-ঐচ্ছিক যুক্তি ( self ) রয়েছে যা একটি নতুন তৈরি হওয়া উদাহরণটির একটি রেফারেন্স ধারণ করে।

ক্লাস পদ্ধতি

আমাদের কিছু কাজ আছে যা classmethod মাধ্যমে সুন্দরভাবে সম্পন্ন করা classmethod

আসুন আমরা অনুমান করি যে আমরা Date অনেকগুলি উদাহরণ তৈরি করতে চাই, যা 'ডিডি-এমএম -YYYY' বিন্যাস সহ একটি স্ট্রিং হিসাবে এনকোড হওয়া বাইরের উত্স থেকে আসা তারিখের তথ্য সম্পর্কিত। ধরুন আমরা আমাদের প্রকল্পের উৎস কোডে বিভিন্ন জায়গায় এটি করতে হবে।

তাই আমরা এখানে কি করতে হবে:

  1. দিন, মাস এবং বছরের জন্য তিনটি পূর্ণসংখ্যা ভেরিয়েবল বা একটি 3-আইটেমের টিপলে যে পরিবর্তনশীল রয়েছে তা পেতে একটি স্ট্রিং বিশ্লেষণ করুন।
  2. প্রারম্ভিক কল থেকে ঐ মানগুলি পাস করে তাত্ক্ষণিক Date

এটি দেখতে হবে:

day, month, year = map(int, string_date.split('-'))
date1 = Date(day, month, year)

এই উদ্দেশ্যে, সি ++ ওভারলোডিং সহ এমন বৈশিষ্ট্যটি বাস্তবায়ন করতে পারে, তবে পাইথনের এই ওভারলোডিংটির অভাব রয়েছে। পরিবর্তে, আমরা classmethod ব্যবহার করতে পারেন। এর আরেকটি "গঠনকারী" তৈরি করা যাক।

    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

date2 = Date.from_string('11-09-2012')

চলুন উপরে প্রয়োগকরণে আরো সতর্কতার সাথে দেখি এবং আমাদের এখানে কী সুবিধা রয়েছে তা পর্যালোচনা করুন:

  1. আমরা এক জায়গায় তারিখ স্ট্রিং পার্সিং প্রয়োগ করেছি এবং এটি এখন পুনঃব্যবহারযোগ্য।
  2. এনক্যাপুলেশন এখানে জরিমানা কাজ করে (যদি আপনি মনে করেন যে আপনি স্ট্রিং পার্সিংকে অন্যত্র একক ফাংশন হিসেবে বাস্তবায়ন করতে পারেন তবে এই সমাধানটি OOP প্যাডডিজমটি আরও ভালভাবে ফিট করে)।
  3. cls একটি বস্তু যে ক্লাস নিজেই ঝুলিতে, ক্লাস একটি উদাহরণ নয়। এটি বেশ শান্ত কারণ আমরা যদি আমাদের Date শ্রেণির উত্তরাধিকারী হব, তবে সকল বাচ্চাদের from_string সংজ্ঞায়িত করা হবে।

স্ট্যাটিক পদ্ধতি

staticmethod সম্পর্কে কি? এটি classmethod মতোই প্রশংসনীয় কিন্তু কোনও বাধ্যতামূলক পরামিতি গ্রহণ করে না (যেমন ক্লাস পদ্ধতি বা উদাহরণ পদ্ধতিটি)।

আসুন পরবর্তী ব্যবহার ক্ষেত্রে তাকান।

আমরা একটি তারিখ স্ট্রিং আছে যে আমরা কোনোভাবে যাচাই করতে চান। এই কার্যটি যৌক্তিকভাবে আমরা যতদূর ব্যবহার করেছি Date শ্রেণীতে আবদ্ধ, কিন্তু এটি তাত্ক্ষণিক প্রয়োজন হয় না।

এখানে staticmethod দরকারী হতে পারে যেখানে। চলুন কোডের পরবর্তী অংশটি দেখি:

    @staticmethod
    def is_date_valid(date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 3999

    # usage:
    is_date = Date.is_date_valid('11-09-2012')

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


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

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


একটু সংকলন

@ স্ট্যাটিকম পদ্ধতি ক্লাসের ভিতরে একটি পদ্ধতি লেখার উপায় যা কোনও বস্তুর উল্লেখ না করেই বলা হয়। সুতরাং স্ব বা cls ​​মত অন্তর্নিহিত যুক্তি পাস করার কোন প্রয়োজন। এটা ঠিকভাবে লেখা আছে যে ক্লাসের বাইরে কীভাবে লেখা হয়েছে, কিন্তু এটি পাইথনে কোনও ব্যবহার নয়, কারণ যদি আপনাকে ক্লাসের ভিতরে কোনও পদ্ধতি অন্তর্ভুক্ত করতে হয় তবে এই পদ্ধতিটি @ স্ট্যাটিকমিথের এই পদ্ধতিতে অংশ নিতে হবে। কেস।

@classmethod যখন আপনি একটি ফ্যাক্টরি পদ্ধতি লিখতে চান তখন এটি গুরুত্বপূর্ণ এবং এই কাস্টম বৈশিষ্ট্যটি ক্লাসে সংযুক্ত করা যেতে পারে। এই বৈশিষ্ট্য (গুলি) উত্তরাধিকারী শ্রেণীর মধ্যে overridden করা যেতে পারে।

এই দুই পদ্ধতির মধ্যে একটি তুলনা নীচে হতে পারে







class-method