2009-12-08 14 views
5
#! /usr/bin/env python 
import os 
import stat 
import sys 
class chkup: 

     def set(file): 
       filepermission = os.stat(file) 
       user_read() 
       user_write() 
       user_exec() 

     def user_read(): 
       """Return True if 'file' is readable by user 
      """ 
      # Extract the permissions bits from the file's (or 
      # directory's) stat info. 
       b = bool(filepermission.st_mode & stat.S_IRUSR) 
       print b 
      return b 

     def user_write(): 
       """Return True if 'file' is readable by user 
      """ 
      # Extract the permissions bits from the file's (or 
      # directory's) stat info. 
       b = bool(filepermission.st_mode & stat.S_WRUSR) 
       print b 
      return b 

     def user_exec(): 
       """Return True if 'file' is readable by user 
      """ 
      # Extract the permissions bits from the file's (or 
      # directory's) stat info. 
       b = bool(filepermission.st_mode & stat.S_IXUSR) 
       print b 
      return b 

def main(): 
     i = chkup() 
     place = '/net/home/f08/itsrsw1/ScriptingWork/quotacheck' 
     i.set(place) 

if __name__ == '__main__': 
     main() 
कि कोड के साथ

मैंमेरी पायथन कक्षा का दावा क्यों है कि मेरे पास 2 के बजाय 2 तर्क हैं?

> Traceback (most recent call last): 
    File "chkup.py", line 46, in <module> 
    main() 
    File "chkup.py", line 43, in main 
    i.set(place) 
TypeError: set() takes exactly 1 argument (2 given) 

किसी भी विचार प्राप्त?

उत्तर

16

एक पायथन कक्षा विधि के लिए पहला तर्क self चर है। यदि आप classInstance.method(parameter) पर कॉल करते हैं, तो विधि method(self, parameter) के रूप में लागू की जाती है।

class MyClass(Object): 
    def my_method(self, parameter): 
     print parameter 

आप Python tutorial के माध्यम से पढ़ने के लिए चाहते हो सकता है:

इसलिए, जब आप अपने वर्ग को परिभाषित कर रहे हैं, कुछ इस तरह से करते हैं।

+1

पर विचार करना चाहिए, धन्यवाद, मैं इसके बारे में भूल गया। यह पाइथन के साथ बनाई गई पहली वास्तविक कक्षा है, इसलिए धैर्य के लिए धन्यवाद। मैंने जावा पर शुरुआत की तो वर्तमान में यह बहुत अलग लगता है! – jphenow

+0

हाँ, मुझे याद है कि जब मैंने पहली बार पाइथन कक्षाओं के साथ काम करना शुरू किया था (मुझे थोड़ा नाराज होने का उल्लेख नहीं किया गया था कि मुझे स्पष्ट रूप से हर जगह "स्वयं" लिखना था)। पाइथन जाने के बारे में सबसे कठिन हिस्सा जावा या सी ++ से सीखने वाले सभी क्रूर को भूलना सीख रहा है :) – Seth

1

self सभी वर्ग सदस्य कार्यों के लिए एक निहित पहला तर्क है। तो i.set(place) कॉल वास्तव में set(i, place) पर कॉल करता है। अपनी कक्षा को परिभाषित करते समय आपको इसे ध्यान में रखना होगा, और इसके बजाय def set(self, file) लिखें।

0

कक्षा में, आपको विधि सदस्यों के लिए self पैरामीटर को ध्यान में रखना होगा।

2

आप स्पष्ट रूप से self चर, जो एक वर्ग का एक उदाहरण का प्रतिनिधित्व करता है, उदाहरण के लिए पारित करने के लिए की जरूरत है:

def set(self, file): 
    filepermission = os.stat(file) 
    self.user_read() 
    self.user_write() 
    self.user_exec() 

यह नहीं है self के नाम से जाना है, लेकिन यह एक अच्छा व्यवहार का पालन करने के लिए है, और अपने कोड होगा अन्य प्रोग्रामर द्वारा समझा जा सकता है।

+0

यह ** स्वयं ** होना चाहिए। User_read(), ** self **। User_write() आदि – atzz

+0

धन्यवाद , atzz, निश्चित रूप से यह एक ही कक्षा के तरीकों के लिए केवल सही है – SilentGhost

0

चूंकि आप कक्षा के बाध्य (उदाहरण) विधि के रूप में set का इलाज कर रहे हैं, तो आपको स्पष्ट रूप से उदाहरण को अपना पहला तर्क प्राप्त करना होगा। इसे सम्मेलन द्वारा "आत्म" कहा जाता है।

def set(self, file): 
    filepermission = os.stat(file) 
    user_read() 
    user_write() 
    user_exec() 
4

क्योंकि आप अपनी तरीकों के पहले पैरामीटर के रूप वस्तु (आम तौर पर self के रूप में) से गुजर रहे हैं। अजगर, इस तरह एक कॉल में:

my_obj.do_something(my_other_obj) 

अनिवार्य रूप से इस तरह एक फोन में desugared है:

class MyClass(object): 
    def do_something(self, my_other_obj): 
     self.my_var = my_other_obj 

:

MyClass.do_something(my_obj, my_other_obj) 

इस प्रकार, पायथन इस तरह की एक विधि हस्ताक्षर के लिए लग रही है तो आपको विधि पर पहला पैरामीटर के रूप में ऑब्जेक्ट को पास करना चाहिए (आमतौर पर self कहा जाता है)।

1

set() कक्षा chkup वर्ग का एक तरीका है। जब आप i.set(place) पर कॉल करते हैं, तो पाइथन विधि के पहले तर्क का उपयोग करते हुए उदाहरण का ट्रैक रखता है। आम तौर पर, प्रत्येक इंस्टेंस विधि को कम से कम एक तर्क प्राप्त होता है, जिसे स्वयं कहा जाता है, और बाद के तर्कों का पालन किया जाता है।आप अपने वर्ग को फिर से परिभाषित करना चाहिए:

class chkup: 
    def set(self, file): 
     "etc..." 

आप stackoverflow पर ऊपर देखो "स्व" और अजगर हो सकता है:

Python __init__ and self what do they do?

आदि

0

आदेश में एक गैर स्थैतिक विधि को परिभाषित करने में आप इस

वर्ग chkup:

जैसे पहले तर्क के रूप में "स्वयं" प्रदान करना होगा
def set(self,file): 
      filepermission = os.stat(file) 

#this, गैर स्थिर तरीकों बनाने के लिए किया जाता है सेट के

#the कॉल() यहाँ

जच = chkup()

chk.set (फ़ाइल का नाम) # टिप्पणी के द्वारा किया

0

पर कॉल करते समय आप "स्वयं" प्रदान नहीं करते हैं क्योंकि पाइथन स्वचालित रूप से कक्षा में सभी विधियों के लिए तर्क के रूप में वर्तमान ऑब्जेक्ट को पास करता है, इसलिए जब आप किसी फ़ंक्शन में 2 तर्क पास करते हैं, तो पाइथन तीसरे तर्क को जोड़ता है वर्तमान वस्तु, विधि समर्थक टोटाइप को इस

संबंधित मुद्दे