পাইথন ক্লাসগুলি কেবল একটি উদাহরণ সহ: কখন (একক) শ্রেণীর উদাহরণ তৈরি করতে হবে এবং পরিবর্তে কখন ক্লাসের সাথে কাজ করা যায়?


11

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

একটি অনুরূপ প্রশ্ন আছে , তবে এর আলাদা ফোকাস রয়েছে:

  1. এটি বিশ্বব্যাপী ভেরিয়েবল এবং ফাংশনকে একটি শ্রেণিতে বিভক্ত করা এবং and
  2. এটি পাইথন-নির্দিষ্ট নয়। পরবর্তী অর্থ এটি (পাইথনের মধ্যে) শ্রেণিগুলিও বস্তুগত বিষয়গুলি বিবেচনা করে না।

হালনাগাদ:

পাইথনে, আমি উভয় শ্রেণী এবং অবজেক্টের সাথে নিম্নলিখিতটি করতে পারি:

class A(object):
    pass

A.some_state_var = True
# Then later
A.some_state_var = False


my_a = A()

my_a.some_state_var = True
# Then later
my_a.some_state_var = False

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

তদ্ব্যতীত, আমার শ্রেণি / শ্রেণীর উদাহরণ তৈরির অনুপ্রেরণা একটি একক প্রয়োজন প্রয়োগ করার জন্য নয়।

এছাড়াও, এটি একটি নতুন টাইপ তৈরি সম্পর্কে তেমন কিছু নয়।

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

উত্তর:


16

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

সুতরাং এটি এই:

class Singleton:
    '''don't bother instantiating me'''
    clsvar1 = 'foo'

    @classmethod
    def foobar(cls, *args, **kwargs):
        if condition():
            cls.clsvar1 = 'bar'

এই বনাম?

class Singleton:
    '''instantiate and use me'''
    def __init__(self):
        self.var1 = 'foo'

    def foobar(self, *args, **kwargs):
        if condition():
            self.var1 = 'bar'

সুপারিশ

আমি অবশ্যই তা ইনস্ট্যান্ট করার উদ্দেশ্যে যা পছন্দ করব। আপনি যখন কোনও "ধরণের জিনিস" তৈরি করেন তখন বোঝায় যে আপনি সেই ধরণের জিনিস তৈরি করেন create

অনুপ্রেরণা হ'ল গ্রুপ সম্পর্কিত কোড এবং ডেটা এবং এটিতে একটি ইন্টারফেস থাকা।

এটি বলেছিল, আপনি যে সমস্ত চান একটি নাম স্থান হিসাবে কেবল মডিউলটি ব্যবহার করবেন না কেন? মডিউলগুলি সিঙ্গলেটন, গ্রুপ সম্পর্কিত কোড এবং ডেটা এবং এটি কিছুটা সহজ এবং সম্ভবত আরও পাইথোনিক হিসাবে বিবেচিত হবে:

var1 ='foo'

def foobar(*args, **kwargs):
    global var1
    if condition():
        var1 = 'bar'

সুতরাং ব্যবহারের পরিবর্তে হবে:

from modules.singleton import Singleton
Singleton.foobar()

অথবা

from modules.singleton import Singleton
the_singleton = Singleton()
the_singleton.foobar()

এটা কর:

from modules import singleton
singleton.foobar()

3
আপনার উত্তরের জন্য ধন্যবাদ. আপনি কি প্রতিটি ফাংশনের জন্য (নতুন ভেরিয়েবলগুলি) নতুন মডিউল তৈরি করার পরামর্শ দিতে চান? এর ফলে অনেকগুলি ছোট ছোট .py ফাইল তৈরি হতে পারে। অথবা আপনি সমস্ত (কমপক্ষে কোনওভাবে সম্পর্কিত) একটি মডিউলে "বর্গ-কম" ফাংশন এবং ভেরিয়েবলগুলি গোষ্ঠীবদ্ধ করবেন?
langlauf.io

আরও একটি মন্তব্য: আপনি লেখেন "যেহেতু আপনারা যা চান তা একটি নামস্থান"। আমি যা চাই তা হ'ল গ্রুপ সম্পর্কিত কোডগুলি, অর্থাৎ ফাংশন এবং ডেটা এক জায়গায়, এবং এর সাথে একটি ইন্টারফেস রাখা উচিত। এটি "টাইপ" তৈরির বিষয়ে তেমন কিছু নয়। ডিজাইনের সময়, এর ফলে ক্লাস ডায়াগ্রামে কোনও ক্লাসের ফলাফল হয়, তাই না?
langlauf.io

2

আমি ভাবছিলাম যে কোন ক্ষেত্রে সরাসরি ক্লাসের সাথে সরাসরি কাজ না করে একক শ্রেণির উদাহরণ তৈরি করা বোধগম্য।

এটি সেই বিষয়গুলির মধ্যে একটি যা যদি আপনি অনেক কিছুতে প্রবেশ করেন তবে ধর্মীয় যুদ্ধের কারণ ঘটবে।

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

আপনি যদি কোনও শ্রেণি কী, তার উদ্দেশ্য / আচরণ কী তা নিয়ে ভাবেন, তবে এটি বোঝা যায়। শ্রেণীর উদ্দেশ্য হ'ল নিজের উপর ভিত্তি করে অবজেক্টগুলির উদাহরণ তৈরি করা । এটি একটি নীলনকশা যা ভবনটিও তৈরি করতে পারে। একটি "ব্যবহারকারী" শ্রেণি "ব্যবহারকারী" অবজেক্ট তৈরি করে। একটি "কুকুর" শ্রেণি "কুকুর" অবজেক্ট ইত্যাদি তৈরি করে

এইটিকে কোনও শ্রেণীর আচরণ বলে বোঝান যে তারপরে "X" ক্লাসে আপনি যে পদ্ধতিগুলি যুক্ত করেন সেগুলি "x" অবজেক্ট তৈরি করার সাথে নিজেদের চিন্তিত করবে।

সুতরাং এমনকি যদি আপনার কেবলমাত্র একটি "x" অবজেক্টের প্রয়োজন হয় তবে আপনার এটি তত্পর হওয়া উচিত।

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

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