अजगर में वर्ग स्थिरांक


129

अजगर में, मैं चाहता हूं कि एक वर्ग कुछ "स्थिरांक" (व्यावहारिक रूप से, चर) हो जो सभी उपवर्गों में आम होगा। क्या यह अनुकूल वाक्यविन्यास के साथ करने का एक तरीका है? अभी मैं उपयोग करता हूं:

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

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

और मैं सोच रहा हूं कि क्या यह करने के लिए एक बेहतर तरीका है या ऐसा करने का कोई तरीका है, तब बिना "पशु" लिखने के। आकारों से पहले। धन्यवाद! संपादित करें: यह उल्लेख करना भूल गया कि घोड़ा जानवर से विरासत में मिला है।


16
एक पूर्ण उत्तर नहीं है लेकिन यदि SIZESकभी नहीं बदलता है, तो निश्चित रूप से एक सूची के बजाय टपल का उपयोग करें। जैसा तो("Huge","Big","Medium","Small")
jamylak

ऐसा लगता है कि आप वास्तव में एक एनम के बाद यहाँ हैं
एरिक

जवाबों:


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"] मैं इस प्रकार के स्थिरांक का उपयोग करूँगा।
लोवा चित्तमुरी

18

आप (उदाहरण विधि में) या (कक्षा विधि में) के SIZESमाध्यम से प्राप्त कर सकते हैं ।self.SIZEScls.SIZES

किसी भी मामले में, आपको यह स्पष्ट करना होगा कि कहां खोजना है SIZES। एक विकल्प SIZESमॉड्यूल युक्त कक्षाओं में रखा जाता है, लेकिन फिर आपको एक ही मॉड्यूल में सभी वर्गों को परिभाषित करने की आवश्यकता होती है।


घोड़ा वास्तव में पशु का एक उपवर्ग है। दरअसल, Animal.SIZES [1] के बजाय self.SIZES [1] का उपयोग करना पूरी तरह से संभव है।
बेताबैंडो

@ लेटाबंडिडो: ओपी ने सवाल को सही किया। तदनुसार उत्तर को अपडेट करेगा।
फ्रेड फू

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

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

इसके अलावा, आप स्वयं, पूर्व के माध्यम से पहुंच सकते हैं। "self.HUGE" या "self.BIG"। यह केवल कक्षा के भीतर ही काम करेगा।
केवरिस

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'?
योद्धा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.