Почему мой класс Python утверждает, что у меня есть 2 аргумента вместо 1?

#! /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()

С этим кодом я получаю

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

Какие-нибудь мысли?

9 ответов

Решение

Первый аргумент для метода класса Python является self переменная. Если вы позвоните classInstance.method(parameter), метод вызывается как method(self, parameter),

Итак, когда вы определяете свой класс, сделайте что-то вроде этого:

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

Вы можете прочитать учебник по Python.

Потому что вы не передаете объект (обычно называемый self) как первый параметр ваших методов. В Python такой вызов:

my_obj.do_something(my_other_obj)

по сути, desugared в вызов, как это:

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) в качестве первого параметра метода.

Вам нужно явно передать self переменная, которая представляет экземпляр класса, например:

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

Это не должно называться self но это хорошее соглашение, и ваш код будет понятен другим программистам.

set() это метод класса chkup, Когда вы звоните i.set(place)Python отслеживает экземпляр i, используя первый аргумент метода. Как правило, каждый метод экземпляра получит хотя бы один аргумент, называемый self, и последующие аргументы будут следовать. Вы должны переопределить свой класс:

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

Вы можете посмотреть "self" и python на stackru:

Python __init__ и self что они делают?

и т.п.

self является неявным первым аргументом для всех функций-членов класса. Итак i.set(place) звонить на самом деле звонки set(i, place), Вы должны принять это во внимание при определении вашего класса и написать def set(self, file) вместо.

В классе вы должны принять во внимание self параметр для членов метода.

Чтобы определить нестатический метод, вы должны указать "self" в качестве первого аргумента, подобного этому

класс чкуп:

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

# это сделано для создания нестатических методов,

# вызов set() здесь выполняется

CHK = chkup ()

chk.set (fileName) # обратите внимание, что вы не указываете "self" при вызове

Так как ты лечишь set как связанный (экземпляр) метод класса, вы должны явно получить экземпляр в качестве первого аргумента. Это называется "я" по соглашению.

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

Это потому, что python автоматически передает текущий объект в качестве аргумента всем методам в классе, поэтому, когда вы передаете 2 аргумента функции, python добавляет третий аргумент, который является текущим объектом, прототип метода должен учитывать это

Другие вопросы по тегам