【问题标题】:Scan computer system file using class definition使用类定义扫描计算机系统文件
【发布时间】:2023-12-06 20:07:01
【问题描述】:

我是 python 新手,很少使用类定义,我尝试运行我的程序但出现错误...有人知道会发生什么吗?还是我的代码有问题?我已经尝试了2天... 这是下面的代码:

import hashlib
import os.path
import os

class QuickScan:
    def md5(self,fname):
        hash_md5 = hashlib.md5()
        try:
            with open(fname, "rb") as f:
                for chunk in iter(lambda: f.read(2 ** 20), b""):
                    hash_md5.update(chunk)
        except Exception:
            pass
        return hash_md5.hexdigest()

    def get_all_abs_paths(self,rootdir):
        viruslist = open('C:/FYP/SecuCOM2022/virusshare.md5.txt','rt')
        virusinside = [l.rstrip() for l in viruslist]
        paths = list()
        virus="detected"
        novirus="clear"
    
        for dirpath,_,filenames in os.walk(rootdir):
            for f in filenames:
              
             paths.append(os.path.abspath(os.path.join(dirpath, f)))

        for filename in paths:
            print(filename, self.md5(filename))
            if self.md5(filename) in virusinside:
                print(virus)
                os.remove(filename)
            else:
                print(novirus)
        

    filenames=get_all_abs_paths('C:/Users/User/Desktop/irustesting')

以下是发生的错误:-

class QuickScan:
  File "c:\FYP\SecuCOM2022\QuickScanTab.py", line 71, in QuickScan

filenames=get_all_abs_paths('C:/Users/User/Desktop/irustesting')
TypeError: get_all_abs_paths() missing 1 required positional argument: 'rootdir'  

【问题讨论】:

  • 你没有实例化QuickScanfilenames=get_all_abs_paths(...) 行也是缩进的,这意味着它在类 QuickScan 的定义内。您必须在该类的实例上调用该函数,并在类定义之外执行此操作。
  • 不要觉得你必须为了使用一个类而使用一个类。
  • 我试图在另一个 python 文件中调用这个函数,所以我想我必须创建这个类
  • 如果这是唯一的原因,就不需要上课。常规函数(与类/方法相比)就可以了。

标签: python class hash md5


【解决方案1】:

get_all_abs_paths() 是类QuickScan 的实例属性(方法)。您需要实例化类QuickScan 的对象并调用它的get_all_abs_paths()

scan = QuickScan()
scan.get_all_abs_paths('C:/Users/User/Desktop/irustesting')

另外,请注意,此方法没有显式返回,因此它确实返回 None,并且将返回值绑定到名称 filenames 的代码没有多大意义。

此外,您需要将其取消缩进一级,此时 filenames=get_all_abs_paths('C:/Users/User/Desktop/irustesting') 在类内。

【讨论】:

  • 天哪,谢谢!问这个愚蠢的问题让我觉得很愚蠢......非常感谢,感谢您的解释!