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

与该代码我收到为什么我的Python类声称我有2个参数而不是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) 

有什么想法?

回答

16

python类方法的第一个参数是self变量。如果调用classInstance.method(parameter),则该方法将调用为method(self, parameter)

所以,当你定义类,做这样的事情:

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

您可能希望通过Python tutorial阅读。

+1

谢谢大家,我忘了那件事。这是我用Python创建的第一个实际的类,所以感谢耐心。我开始使用Java,所以目前这感觉非常不同! – jphenow 2009-12-08 17:58:24

+0

是的,我记得当我第一次开始使用Python类时有类似的问题(更不用说有点恼火,我不得不在任何地方明确地写“self”)。关于python最难的部分是学习忘记所有从Java或C++学到的东西:) – Seth 2009-12-08 19:19:39

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

应该是** self **。user_read(),** self **。user_write()等。 – atzz 2009-12-08 17:57:05

+0

谢谢,atzz,当然这只适用于同类方法 – SilentGhost 2009-12-08 18:00:31

0

由于您将set视为类的绑定(实例)方法,因此您必须明确接收实例作为第一个参数。按惯例称之为“自我”。

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

因为您没有将对象(通常称为self)作为第一个参数传递给您的方法。在Python中,像这样的电话:

my_obj.do_something(my_other_obj) 

基本上脱成这样调用:

MyClass.do_something(my_obj, my_other_obj) 

因此,Python是在寻找这样一个方法签名:

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

因此,您应该将对象(通常称为self)作为第一个参数传递给方法

1

set()是类chkup的方法。当你打电话给i.set(place)时,python使用方法的第一个参数跟踪实例i。通常,每个实例方法都会接收至少一个名为self的参数,随后的参数会随之而来。你应该重新定义你的类:

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

你可能会查找“自我”和Python的计算器:

Python __init__ and self what do they do?

0

为了定义一个非静态方法你必须提供“自我”这样的第一个参数

class chkup:

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

#这是为了使非静态方法,一套

#the()调用这里由

CHK = chkup()

chk.set(文件名)#做笔记那你在调用时不提供“self”

0

那是因为python会自动将当前对象作为参数传递给类中的所有方法,所以当您将2个参数传递给一个函数时,python将追加第三个参数当前对象,方法亲totype应该考虑这个

相关问题