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

Với mã mà tôi nhậnTại sao lớp Python của tôi cho rằng tôi có 2 đối số thay vì 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) 

Bất kỳ suy nghĩ?

Trả lời

16

Đối số đầu tiên cho một phương thức lớp python là biến số self. Nếu bạn gọi classInstance.method(parameter), phương thức được gọi là method(self, parameter).

Vì vậy, khi bạn đang xác định lớp học của bạn, làm một cái gì đó như thế này:

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

Bạn có thể muốn đọc qua Python tutorial.

+1

Cảm ơn tất cả, tôi quên điều đó. Đây là lớp thực tế đầu tiên tôi đã tạo với Python, vì vậy cảm ơn sự kiên nhẫn. Tôi bắt đầu trên Java nên hiện tại điều này cảm thấy khá khác nhau! – jphenow

+0

Vâng, tôi nhớ có vấn đề tương tự khi tôi lần đầu tiên bắt đầu làm việc với các lớp Python (không phải đề cập đến hơi khó chịu mà tôi đã phải viết một cách rõ ràng "tự" ở khắp mọi nơi). Phần khó nhất về việc đi python là học cách quên tất cả các cruft mà bạn đã học được từ Java hoặc C++ :) – Seth

1

self là một đối số đầu tiên tiềm ẩn cho tất cả các hàm thành viên của lớp. Vì vậy, cuộc gọi i.set(place) thực sự gọi set(i, place). Bạn cần tính đến điều này khi xác định lớp học của mình và thay vào đó hãy viết def set(self, file).

0

Trong một lớp học, bạn cần tính đến thông số self cho các thành viên của phương pháp.

2

Bạn cần phải vượt qua một cách rõ ràng self biến, đại diện cho một thể hiện của một lớp học, ví dụ:

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

Nó không phải được gọi self nhưng đó là một ước tốt để làm theo, và mã của bạn sẽ được hiểu bởi các lập trình viên khác.

+0

Điều đó sẽ là ** tự **. User_read(), ** self **. User_write(), v.v. – atzz

+0

Cảm ơn , atzz, tất nhiên nó chỉ đúng cho các phương thức cùng lớp – SilentGhost

0

Vì bạn đang xử lý set làm phương thức ràng buộc (ví dụ) của một lớp, bạn phải nhận rõ ràng cá thể đó làm đối số đầu tiên của bạn. Nó được gọi là "tự" theo quy ước.

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

Vì bạn không chuyển đối tượng (thường được gọi là self) làm thông số đầu tiên cho phương pháp của mình. Trong Python, một cuộc gọi như thế này:

my_obj.do_something(my_other_obj) 

được về cơ bản khử đường thành một cuộc gọi như thế này:

MyClass.do_something(my_obj, my_other_obj) 

Do đó, Python đang tìm kiếm một phương pháp chữ ký như thế này:

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

Vì vậy, bạn nên chuyển đối tượng (thường được gọi là self) làm tham số đầu tiên cho phương thức .

1

set() là phương thức của lớp chkup. Khi bạn gọi i.set(place), python theo dõi cá thể i bằng cách sử dụng đối số đầu tiên cho phương thức. Nói chung, mọi phương thức thể hiện sẽ nhận được ít nhất một đối số, được gọi là tự, và các đối số tiếp theo theo sau.Bạn nên xác định lại lớp học của bạn:

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

Bạn có thể tìm kiếm "tự" và trăn trên stackoverflow:

Python __init__ and self what do they do?

, vv

0

để xác định một phương pháp không tĩnh bạn phải cung cấp "tự" làm đối số đầu tiên như thế này

lớp chkup:

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

#this được thực hiện để làm cho phương pháp không tĩnh, gọi

# Các của set() ở đây được thực hiện bởi

chk = chkup()

chk.set (fileName) # lưu ý rằng bạn không cung cấp "tự" khi gọi

0

Thats vì python tự động chuyển đối tượng hiện tại làm đối số cho tất cả các phương thức trong lớp, vì vậy khi bạn chuyển 2 đối số vào hàm, python sẽ thêm đối số thứ ba đối tượng hiện tại, phương pháp chuyên nghiệp totype nên xem xét điều này

Các vấn đề liên quan