2012-12-29 18 views
21

में अजगर बुला विधि मैं अपने वजन यहाँ ऊपर जिस तरह से छिद्रण कर रहा हूँ, लेकिन इस अजगर शौकिया के साथ सहन कृपया। मैं व्यापार द्वारा एक PHP डेवलपर हूं और मैंने पहले ही इस भाषा को छुआ नहीं है।वर्ग

मुझे क्या करना कोशिश कर रहा हूँ एक कक्षा में एक विधि कॉल है ... काफी सरल लगता है? मैं पूरी तरह से 'आत्म' के संदर्भ में परेशान हूं, और कक्षा के अंदर और कक्षा के बाहर ऐसी विधि को कॉल करने की सही प्रक्रिया क्या है।

किसी समझा सकते हैं मेरे लिए, कैसे चर RIGHT साथ move विधि कॉल करने के। मैंने कई 'सीखने वाले पायथन' साइटों और स्टैक ओवरव्लो पर खोजों पर शोध करने की कोशिश की है, लेकिन इसका कोई फायदा नहीं हुआ है। किसी भी तरह की सहायता को आभार समझेंगे।

निम्नलिखित वर्ग स्कॉट अजगर स्क्रिप्ट जो एक टर्मिनल जीयूआई (urwid) द्वारा पहुँचा है में काम करता है।

समारोह के साथ मैं काम कर रहा हूँ एक स्कॉट वेस्टन की मिसाइल लॉन्चर अजगर स्क्रिप्ट है, जो मैं एक PHP वेब सर्वर में हुक करने की कोशिश कर रहा हूँ है।

class MissileDevice: 
    INITA  = (85, 83, 66, 67, 0, 0, 4, 0) 
    INITB  = (85, 83, 66, 67, 0, 64, 2, 0) 
    CMDFILL = (8, 8, 
       0, 0, 0, 0, 0, 0, 0, 0, 
       0, 0, 0, 0, 0, 0, 0, 0, 
       0, 0, 0, 0, 0, 0, 0, 0, 
       0, 0, 0, 0, 0, 0, 0, 0, 
       0, 0, 0, 0, 0, 0, 0, 0, 
       0, 0, 0, 0, 0, 0, 0, 0, 
       0, 0, 0, 0, 0, 0, 0, 0) 
    STOP  = (0, 0, 0, 0, 0, 0) 
    LEFT  = (0, 1, 0, 0, 0, 0) 
    RIGHT  = (0, 0, 1, 0, 0, 0) 
    UP  = (0, 0, 0, 1, 0, 0) 
    DOWN  = (0, 0, 0, 0, 1, 0) 
    LEFTUP = (0, 1, 0, 1, 0, 0) 
    RIGHTUP = (0, 0, 1, 1, 0, 0) 
    LEFTDOWN = (0, 1, 0, 0, 1, 0) 
    RIGHTDOWN = (0, 0, 1, 0, 1, 0) 
    FIRE  = (0, 0, 0, 0, 0, 1) 

    def __init__(self, battery): 
    try: 
     self.dev=UsbDevice(0x1130, 0x0202, battery) 
     self.dev.open() 
     self.dev.handle.reset() 
    except NoMissilesError, e: 
     raise NoMissilesError() 

    def move(self, direction): 
    self.dev.handle.controlMsg(0x21, 0x09, self.INITA, 0x02, 0x01) 
    self.dev.handle.controlMsg(0x21, 0x09, self.INITB, 0x02, 0x01) 
    self.dev.handle.controlMsg(0x21, 0x09, direction+self.CMDFILL, 0x02, 0x01) 
+0

आपको क्या लगता है कि आपके कोड के साथ गलत है? ऐसा लगता है कि आप 'स्वयं' अधिकार का उपयोग कर रहे हैं। – Marcin

+0

उपरोक्त कोड के बारे में नहीं, यह एक कोड है जो काम कोड से लिया गया है। मैं एक और प्राथमिक सवाल पूछ रहा हूँ; कक्षा के भीतर एक विधि कैसे कॉल करें। – kirgy

+0

मैं यह बता रहा था कि इस दिए गए उदाहरण का उपयोग करके कक्षा से विधि कैसे कॉल करें। जैसा ऊपर बताया गया है। मैं एक समाधान के बजाय एक स्पष्टीकरण के बाद था। कक्षा बनाने के दौरान – kirgy

उत्तर

43

सभी विधियों का पहला तर्क आमतौर पर self कहा जाता है। यह उस उदाहरण को संदर्भित करता है जिसके लिए विधि कहा जा रहा है।

class A(object): 
    def foo(self): 
     print 'Foo' 

    def bar(self, an_argument): 
     print 'Bar', an_argument 

फिर, क्या कर रही:

मान लीजिए कि आप करते हैं

a = A() 
a.foo() #prints 'Foo' 
a.bar('Arg!') #prints 'Bar Arg!' 

इस बारे में विशेष कुछ भी नहीं है self बुलाया जा रहा है निम्नलिखित तुम कर सकते हो,:

class B(object): 
    def foo(self): 
     print 'Foo' 

    def bar(this_object): 
     this_object.foo() 

फिर, क्या कर रही:

b = B() 
b.bar() # prints 'Foo' 

अपने विशिष्ट मामले में: (! के रूप में टिप्पणी में सुझाव दिया MissileDevice.RIGHT अधिक उपयुक्त यहां हो सकता है)

dangerous_device = MissileDevice(some_battery) 
dangerous_device.move(dangerous_device.RIGHT) 

आप मॉड्यूल स्तर पर अपने सभी स्थिरांक की घोषणा कर सकता है हालांकि, तो आप कर सकता है:

dangerous_device.move(RIGHT) 

हालांकि, यह इस बात पर निर्भर करेगा कि आप अपना कोड कैसे व्यवस्थित करना चाहते हैं!

+1

बिंदु पर विचार किया गया है कि कक्षा पर 'अधिकार' कैसे परिभाषित किया गया है, शायद यह लेखक का इरादा था कि इसे 'one_instance.ATTRIBUTE' के बजाय 'ClassName.ATTRIBUTE' कहा जाता है, हालांकि यह सभी उदाहरणों के लिए समान होना चाहिए , और आपको इसका संदर्भ देने के लिए एक उदाहरण की आवश्यकता नहीं है; इसलिए ... 'मिसाइलडिवाइस.आरजीएचटी' शायद इस वर्ग का उपयोग करने का "सही" तरीका है। – SingleNegationElimination

+0

मैं इसे अपने विशिष्ट उदाहरण के लिए काम करने के लिए नहीं मिला, लेकिन मुझे विश्वास है कि यह 'बैटरी' के साथ क्या करना है, क्योंकि प्रश्न वास्तव में कक्षा/विधियों के बारे में है जो आपने समझाया है सही है, मैं इस जवाब को चिह्नित करने के लिए हूं सही बात। मैंने सोचा कि आईडी यहां यह ध्यान दें, अगर कोई विकसित missile.py कोड खोज रहा है तो यहां आता है। – kirgy

1

किसी ने मुझे समझा सकते हैं, कैसे इस कदम विधि चर अधिकार के साथ कॉल करने के लिए

>>> myMissile = MissileDevice(myBattery) # looks like you need a battery, don't know what that is, you figure it out. 
>>> myMissile.move(MissileDevice.RIGHT) 

आप अजगर के अलावा, वर्गों के साथ किसी भी अन्य भाषा में प्रोग्राम किया है, तो बात

इस तरह की
class Foo: 
    bar = "baz" 

शायद अपरिचित है।पायथन में, कक्षा वस्तुओं के लिए एक कारखाना है, लेकिन यह स्वयं एक वस्तु है; और इसके दायरे में परिभाषित चर वर्ग से जुड़ा हुआ है, कक्षा द्वारा लौटाए गए उदाहरणों से नहीं। ऊपर bar का संदर्भ लें, आप इसे Foo.bar पर कॉल कर सकते हैं; आप कक्षा के उदाहरणों के माध्यम से कक्षा विशेषताओं तक पहुंच सकते हैं, जैसे Foo().bar


इम क्या 'स्वयं' भी संदर्भित करता है के बारे में पूरी तरह से चकित,

>>> class Foo: 
...  def quux(self): 
...   print self 
...   print self.bar 
...  bar = 'baz' 
... 
>>> Foo.quux 
<unbound method Foo.quux> 
>>> Foo.bar 
'baz' 
>>> f = Foo() 
>>> f.bar 
'baz' 
>>> f 
<__main__.Foo instance at 0x0286A058> 
>>> f.quux 
<bound method Foo.quux of <__main__.Foo instance at 0x0286A058>> 
>>> f.quux() 
<__main__.Foo instance at 0x0286A058> 
baz 
>>> 

जब आप एक अजगर वस्तु पर एक विशेषता acecss, दुभाषिया, देखेंगे जब ऊपर देखा विशेषता थी कक्षा पर, और एक कार्य है, कि इसे फ़ंक्शन के बजाय "बाध्य" विधि वापस करनी चाहिए। यह सब कुछ तर्क के रूप में पारित होने के लिए व्यवस्था की व्यवस्था है।

4

मान लें कि आपके पास एक चमकदार फू क्लास है। वैसे आप 3 विकल्प हैं:

1) आप उस वर्ग की परिभाषा के अंदर एक वर्ग की विधि (या विशेषता) का उपयोग करना चाहते:

class Foo(object): 
    attribute1 = 1     # class attribute (those don't use 'self' in declaration) 
    def __init__(self): 
     self.attribute2 = 2   # instance attribute (those are accessible via first 
            # parameter of the method, usually called 'self' 
            # which will contain nothing but the instance itself) 
    def set_attribute3(self, value): 
     self.attribute3 = value 

    def sum_1and2(self): 
     return self.attribute1 + self.attribute2 

2) आप विधि का उपयोग करना चाहते हैं (या एक वर्ग के गुण) उस वर्ग

def get_legendary_attribute1(): 
    return Foo.attribute1 

def get_legendary_attribute2(): 
    return Foo.attribute2 

def get_legendary_attribute1_from(cls): 
    return cls.attribute1 

get_legendary_attribute1()   # >>> 1 
get_legendary_attribute2()   # >>> AttributeError: type object 'Foo' has no attribute 'attribute2' 
get_legendary_attribute1_from(Foo) # >>> 1 

3 की परिभाषा के बाहर) आप एक instantiated वर्ग की विधि (या विशेषता) का उपयोग करना चाहते:

f = Foo() 
f.attribute1       # >>> 1 
f.attribute2       # >>> 2 
f.attribute3       # >>> AttributeError: 'Foo' object has no attribute 'attribute3' 
f.set_attribute3(3) 
f.attribute3       # >>> 3