পাইথনের ক্লাস পদ্ধতিগুলির মধ্যে আমি কীভাবে "স্থিতিশীল" শ্রেণীর ভেরিয়েবলগুলি অ্যাক্সেস করতে পারি?


162

আমার যদি নিম্নলিখিত পাইথন কোড থাকে:

class Foo(object):
    bar = 1

    def bah(self):
        print(bar)

f = Foo()
f.bah()

এটা অভিযোগ

NameError: global name 'bar' is not defined

barপদ্ধতির মধ্যে আমি কীভাবে ক্লাস / স্থির পরিবর্তনশীল অ্যাক্সেস করতে পারি bah?


: পাইথন এবং স্থিতিবিদ্যা সংক্রান্ত আরও তথ্য পাওয়া যাবে এখানে stackoverflow.com/questions/68645/python-static-variable
bedwyr

উত্তর:


166

পরিবর্তে barব্যবহার self.barবা Foo.bar। অ্যাসাইন করা Foo.barএকটি স্থিতিশীল ভেরিয়েবল তৈরি করবে এবং এ্যাসাইন করা self.barএকটি উদাহরণ ভেরিয়েবল তৈরি করবে।


12
Foo.bar কাজ করবে তবে স্ব.বার বার একটি স্থির নয়, একটি উদাহরণ পরিবর্তনশীল তৈরি করে।
শয্যাশায়ী

47
বেডওয়াইর, "মুদ্রণ সেল্ট বার।" কোনও ইনস্ট্যান্স ভেরিয়েবল তৈরি করবে না (যদিও সেলফ.বারকে দেওয়া হবে)।
কনস্টান্টিন

@ কনস্টান্টিন - আমি বুঝতে পারি নি, এটি একটি আকর্ষণীয় পার্থক্য। সংশোধনের জন্য ধন্যবাদ :-)
শয্যাশায়ী

2
তবে যদি আপনি সেখানে ivar হওয়ার ইচ্ছা না রাখেন তবে Foo.classmember ব্যবহার করা এর আরও পরিষ্কার।
এম কে 12

2
স্ট্যাটিক ভেরিয়েবলগুলি ব্যবহার করার সময়, এখান থেকে গোটচগুলি পড়া ভাল ধারণা: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 66645৫/২ । @ কনস্টান্টিন অনেকগুলি গ্যাচের মধ্যে একটি দেয়।
ট্রেভর বয়ড স্মিথ

84

শ্রেণি পদ্ধতি নির্ধারণ করুন:

class Foo(object):
    bar = 1
    @classmethod
    def bah(cls):    
        print cls.bar

এখন যদি bah()উদাহরণ পদ্ধতি হতে হয় (যেমন স্বতে অ্যাক্সেস থাকতে পারে), আপনি এখনও ক্লাস ভেরিয়েবলটি সরাসরি অ্যাক্সেস করতে পারেন।

class Foo(object):
    bar = 1
    def bah(self):    
        print self.bar

3
স্ব .__ক্লাস__.বারের পরিবর্তে শুধু ফু.বার নয় কেন?
এম কে 12

15
@ এমকে 12: আপনি যখন শ্রেণীর উত্তরাধিকার পেয়েছেন, তখন একটি "শ্রেণীর ভেরিয়েবল" বেস ক্লাস বা উপক্লাসে থাকতে পারে। আপনি কোনটি উল্লেখ করতে চান? আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে। Foo.bar সর্বদা নির্দিষ্ট শ্রেণীর একটি বৈশিষ্ট্য উল্লেখ করে - যা একটি বেস শ্রেণি বা উপশ্রেণী হতে পারে। স্ব .__ক্লাস__. বার উদাহরণস্বরূপ যে ধরণের শ্রেণীর জন্য নির্দেশ করে।
ক্রেগ ম্যাককুইন

7
এখন আমরা সেই দুর্ভাগ্যজনক পর্যায়ে পৌঁছেছি যখন আমরা ভাষার বিবরণ সম্পর্কে এতটা সচেতন হয়ে উঠি যে আমরা দুটি সূক্ষ্ম পরিমাণে ব্যবহারের ক্ষেত্রে বৈষম্য করতে পারি। এটি প্রকৃতপক্ষে আপনি যা করতে চান তা নির্ভর করে তবে অনেক লোক এ জাতীয় সূক্ষ্মতায় অংশ নেবেন না।
হোল্ডেনওয়েব

2
বিটিডাব্লু, এটি "ক্লাস ভেরিয়েবল" এর একটি বিরল ব্যবহার। এটি একটি নির্দিষ্ট শ্রেণিতে সংজ্ঞায়িত করা আরও বেশি সাধারণ, এখানে ফু। এটি কিছু উন্নত প্রোগ্রামিং পরিস্থিতির জন্য দরকারী তথ্য। তবে প্রায়শই মূল প্রশ্নটি উত্তর হিসাবে কী চেয়েছিল তা নয় (যার উত্তরটির এই উত্তর প্রয়োজন তিনি ইতিমধ্যে Foo.bar কীভাবে করবেন তা জানেন। +1 কারণ আমি এ থেকে কিছু শিখেছি।
নির্মাতা স্টিভ

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

13

সমস্ত ভাল উদাহরণের মতো, আপনি আসলে যা করার চেষ্টা করছেন তা আপনি সরল করেছেন। এটি ভাল, তবে এটি লক্ষণীয় যে ক্লাস বনাম উদাহরণের ভেরিয়েবলগুলির ক্ষেত্রে অজগরটিতে অনেক নমনীয়তা থাকে। একই পদ্ধতি সম্পর্কে বলা যেতে পারে। সম্ভাবনার একটি ভাল তালিকার জন্য, আমি মাইকেল ফেস্টের নতুন ধাঁচের ক্লাসের ভূমিকা , বিশেষত বিভাগ 2 থেকে 6 এর মধ্যে পড়ার পরামর্শ দিই

একটি জিনিস যা শুরু করার সময় মনে রাখতে প্রচুর কাজ নেয় তা হ'ল অজগর জাভা নয়। একটি ক্লিচের চেয়েও বেশি কিছু। জাভাতে, একটি সম্পূর্ণ শ্রেণিটি সঙ্কলিত হয়, যা নেমস্পেসের রেজোলিউশনটিকে বাস্তবের সহজ করে তোলে: কোনও পদ্ধতির (যে কোনও জায়গায়) বাইরে ঘোষিত যে কোনও ভেরিয়েবলগুলি হ'ল উদাহরণ (বা, যদি স্থির, শ্রেণি) ভেরিয়েবল হয় এবং পদ্ধতিগুলির মধ্যে সুস্পষ্টভাবে অ্যাক্সেসযোগ্য হয়।

অজগর সহ, থাম্বের দুর্দান্ত নিয়মটি হল যে তিনটি নেমস্পেসগুলি ক্রম অনুসারে, ভেরিয়েবলগুলির জন্য অনুসন্ধান করা হয়:

  1. ফাংশন / পদ্ধতি
  2. বর্তমান মডিউল
  3. Builtins

{begin pedagogy}

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

>>> class A(object):
        foo = 'foo'
        bar = foo


>>> A.foo
'foo'
>>> A.bar
'foo'

কিন্তু:

>>> class B(object):
        foo = 'foo'
        def get_foo():
            return foo
        bar = get_foo()



Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    class B(object):
  File "<pyshell#11>", line 5, in B
    bar = get_foo()
  File "<pyshell#11>", line 4, in get_foo
    return foo
NameError: global name 'foo' is not defined

{end pedagogy}

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


আইআইআরসি, এখানে প্রযুক্তিগতভাবে 3 (+) নামের স্থান অনুসন্ধান করা হয়েছে - ফাংশন-স্থানীয়, মডিউল / গ্লোবাল এবং বিল্টিনস। নেস্টেড স্কোপগুলি মানে একাধিক স্থানীয় স্কোপগুলি অনুসন্ধান করা যেতে পারে, তবে এটি ব্যতিক্রমী ক্ষেত্রে অন্যতম। (...)
জেফ শ্যানন

এছাড়াও, আমি 'মডিউল' বলার ক্ষেত্রে যত্নবান হব, কারণ এটি ফাংশনটির মূল মডিউলটি নয় এমন মডিউলটি অনুসন্ধান করেছে ... এবং উদাহরণস্বরূপ থেকে বৈশিষ্ট্যটি অনুসন্ধান করা আলাদা জিনিস, তবে কেন এই উত্তরটি ব্যাখ্যা করে তা কেন আপনার উদাহরণ / শ্রেণি রেফার প্রয়োজন।
জেফ শ্যানন


-2
class Foo(object):    
    bar = 1

    def bah(object_reference):
        object_reference.var = Foo.bar
        return object_reference.var


f = Foo() 
print 'var=', f.bah()

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