我有一个如下的python类。
class copyingfiles():
@staticmethod
def __init__(self, x=[], y=[], z=None, i=None):
self.x = x
self.y = y
self. z = z
self.i= i
@staticmethod
def mover(self):
x = self.x
y= self.y
z = self.z
i= self.i
for sam in x.keys():
for pids in y:
PID = pids.split('_')[1]
if sam in pids:
destination = z + "/rep/" + "study/" + id + "/" + sam + "/rh/"+ "fg/"
if not os.path.isdir(destination):
pathlib.Path(destination).mkdir(parents=True, exist_ok=True)
for files in fnmatch.filter(os.listdir(i), pat="*.gz"):
if sam in files:
shutil.copy(os.path.join(i,files), os.path.join(destination,files))
return(destination)
其中x = [],y = []是字典,z = None,I = None是路径。
然后我尝试在类copyingfiles
中调用该函数,如下所示,
testInstance = copyingfiles()
testInstance.mover(x, y,z,i)
它抛出以下错误,
TypeError Traceback (most recent call last)
<ipython-input-50-7da378685d71> in <module>
----> 1 testInstance = copyingfiles()
2 testInstance.mover(x, y,z,i)
TypeError: __init__() missing 1 required positional argument: 'self'
我对python类有理论上的理解。但是,从未尝试过。因此,任何帮助都会很棒!
答案 0 :(得分:3)
只需删除@staticmethod
,当您不想将方法链接到对象的实例(即copyingfile.mover()
)时,就可以使用它们。
您还应该使用PascalCase(首字母大写)重命名您的类,并在class copyingfiles
之后删除括号。
答案 1 :(得分:1)
__init__
(构造函数)不能为静态方法。当您调用类MyClass()
的构造函数时,将调用__init__
方法。 self
是该方法所属的对象的占位符参数-它使您可以访问该对象的属性。但是,如果将其设置为@staticmethod
,则self
会被解释为常规参数-这就是为什么您看到Required 1 argument
错误的原因。
答案 2 :(得分:1)
在定义@staticmethod
之前删除__init__
装饰器。当您使用@staticmethod
装饰方法时,该方法不会将对象用作隐式第一个参数(因此,不应将self
放在其签名中)。
例如,在下面,即使A.non_static
需要参数self
,您也可以看到这两个方法都被称为,而没有传递任何显式参数。这是因为通常的方法会隐式接收self
,而静态方法则不会。
>>> class A:
... @staticmethod
... def static(): # No `self` argument
... print('static')
... def non_static(self): # Here `self` is required
... print('non-static')
>>> a = A() # a is an instance of A
>>> a.static()
'static'
>>> a.non_static()
'non-static'