Почему мой класс 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
Потому что вы не передаете объект (обычно называемый 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 добавляет третий аргумент, который является текущим объектом, прототип метода должен учитывать это