2009-12-08 30 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() 

Con ese código recibo¿Por qué mi clase de Python afirma que tengo 2 argumentos en lugar de 1?

> 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) 

¿Alguna idea?

Respuesta

16

El primer argumento para un método de clase python es la variable self. Si llama al classInstance.method(parameter), el método se invoca como method(self, parameter).

Por lo tanto, cuando se está definiendo la clase, hacer algo como esto:

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

Es posible que desee leer a través de la Python tutorial.

+1

Gracias a todos, me olvidé de eso. Esta es la primera clase real que he creado con Python, así que gracias por la paciencia. Empecé en Java, así que actualmente esto se siente bastante diferente. – jphenow

+0

Sí, recuerdo haber tenido problemas similares cuando comencé a trabajar con las clases de Python (sin mencionar que me molestaba un poco que tuviera que escribir explícitamente "self" en todos lados). La parte más difícil de ir python es aprender a olvidar todo el material que aprendiste de Java o C++ :) – Seth

1

self es un primer argumento implícito para todas las funciones de los miembros de la clase. Entonces la llamada i.set(place) realmente llama al set(i, place). Debe tener esto en cuenta al definir su clase y, en su lugar, escriba def set(self, file).

0

En una clase, debe tener en cuenta el parámetro self para los miembros del método.

2

Es necesario pasar explícitamente self variable, lo que representa una instancia de una clase, por ejemplo:

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

No tiene por qué ser llamados self pero es una buena convención de seguir, y el código se ser entendido por otros programadores.

+0

Debe ser ** self **. User_read(), ** self **. User_write() etc. – atzz

+0

Gracias , atzz, por supuesto, solo es correcto para los métodos de la misma clase – SilentGhost

0

Dado que está tratando set como método enlazado (instancia) de una clase, debe recibir explícitamente la instancia como su primer argumento. Se llama "yo" por convención.

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

Debido a que usted no está pasando el objeto (generalmente conocido como self) como primer parámetro a sus métodos. En Python, una llamada así:

my_obj.do_something(my_other_obj) 

se Desazucarado esencialmente en una llamada como ésta:

MyClass.do_something(my_obj, my_other_obj) 

De este modo, Python está buscando una firma método como este:

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

Por lo tanto, debe pasar el objeto (generalmente llamado self) como el primer parámetro para un método .

1

set() es un método de la clase chkup. Cuando llamas al i.set(place), python realiza un seguimiento de la instancia i utilizando el primer argumento del método. En general, cada método de instancia recibirá al menos un argumento, llamado self, y los siguientes argumentos.Deberá volver a definir su clase:

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

usted podría mirar hacia arriba "yo" y el pitón en stackoverflow:

Python __init__ and self what do they do?

etc.

0

con el fin de definir un método no estático se debe proporcionar "self" como primer argumento como este

clase chkup:

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

#Esta se hace para hacer que los métodos no estáticos,

# La llamada del set() aquí hecho por

chk = chkup()

chk.set (nombre del archivo) # nota que no proporciona "self" al llamar

0

Eso es porque python automáticamente pasa el objeto actual como un argumento para todos los métodos en la clase, así que cuando pasa 2 argumentos a una función, Python agrega el tercer argumento que es el objeto actual, el método pro totype debería considerar esto

Cuestiones relacionadas