অজগর শ্রেণীর ধ্রুবক


128

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

class Animal:
    SIZES=["Huge","Big","Medium","Small"]

class Horse(Animal):
    def printSize(self):
        print(Animal.SIZES[1])

এবং আমি ভাবছি যে এটি করার আরও ভাল উপায় বা এটি করার কোনও উপায় আছে যদি না তখন "অ্যানিম্যাল" না লিখে থাকে। আকারের আগে। ধন্যবাদ! সম্পাদনা: ঘোড়াটি প্রাণী থেকে প্রাপ্ত বলে উল্লেখ করতে ভুলে গিয়েছি।


16
পুরো উত্তর নয় তবে যদি SIZESকখনও পরিবর্তন না হয় তবে অবশ্যই তালিকার পরিবর্তে একটি টিপল ব্যবহার করুন। ভালো লেগেছে("Huge","Big","Medium","Small")
জামিলাক

দেখে মনে হচ্ছে আপনি সত্যিই এখানে কোনও এনামের পরে
এরিক

উত্তর:


141

যেহেতু Horseএকটি সাবক্লাস Animal, তাই আপনি কেবল পরিবর্তন করতে পারেন

print(Animal.SIZES[1])

সঙ্গে

print(self.SIZES[1])

তবুও, আপনার অবশ্যই এর SIZES[1]অর্থ "বড়" মনে রাখা দরকার , তাই সম্ভবত আপনি কিছু কোড করে আপনার কোডটি উন্নত করতে পারেন:

class Animal:
    SIZE_HUGE="Huge"
    SIZE_BIG="Big"
    SIZE_MEDIUM="Medium"
    SIZE_SMALL="Small"

class Horse(Animal):
    def printSize(self):
        print(self.SIZE_BIG)

অন্যথা, আপনি অন্তর্বর্তী শ্রেণীর তৈরি করা যায়নি: HugeAnimal, BigAnimal, এবং তাই। এটি বিশেষত সহায়ক হবে যদি প্রতিটি প্রাণী শ্রেণিতে বিভিন্ন যুক্তি থাকে।


SIZE_BIG = ["BigOne", "BigTwo"] আমি এই ধরণের ধ্রুবকটি ব্যবহার করব।
লোভা চিত্তমুরি

17

আপনি পেতে পারেন SIZESমাধ্যমে self.SIZES(একটি দৃষ্টান্ত পদ্ধতিতে) অথবা cls.SIZES(ক বর্গ পদ্ধতিতে)।

যে কোনও ক্ষেত্রে, আপনাকে কোথায় সন্ধান করতে হবে সে সম্পর্কে আপনাকে স্পষ্ট করতে হবে SIZESSIZESক্লাসগুলি সমন্বিত মডিউলটিতে রাখার বিকল্প রয়েছে , তবে তারপরে আপনাকে একটি ক্লাসে সমস্ত ক্লাস সংজ্ঞায়িত করতে হবে।


ঘোড়া প্রকৃতপক্ষে প্রাণীর একটি সাবক্লাস। প্রকৃতপক্ষে, অ্যানিমাল.সাইজেস [1] এর পরিবর্তে সেল্ফ সিজ [1] ব্যবহার করা পুরোপুরি সম্ভব।
বেটবান্ডো

@ বেতাবাদিও: ওপি প্রশ্নটি সংশোধন করেছে। সেই অনুযায়ী উত্তর আপডেট করবে।
ফ্রেড ফু

12
class Animal:
    HUGE = "Huge"
    BIG = "Big"

class Horse:
    def printSize(self):
        print(Animal.HUGE)

এছাড়াও আপনি নিজের, প্রাক্তন মাধ্যমে অ্যাক্সেস করতে পারেন। "self.HUGE" বা "self.BIG"। এটি কেবল শ্রেণীর মধ্যে অভ্যন্তরীণভাবে কাজ করবে।
cevaris

4

বেতবান্দোর জবাব প্রসারিত করে আপনি মডিউলটিতে স্থির হিসাবে বৈশিষ্ট্যগুলি ইনজেক্ট করার জন্য একটি ফাংশন লিখতে পারেন:

def module_register_class_constants(klass, attr_prefix):
    globals().update(
        (name, getattr(klass, name)) for name in dir(klass) if name.startswith(attr_prefix)
    )

class Animal(object):
    SIZE_HUGE = "Huge"
    SIZE_BIG = "Big"

module_register_class_constants(Animal, "SIZE_")

class Horse(Animal):
    def printSize(self):
        print SIZE_BIG

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